09009

[Java] 클래스 간의 관계 - 포함관계 본문

Back-End/JAVA
[Java] 클래스 간의 관계 - 포함관계
09009 2023. 3. 11.

이전 내용 참고

 

[Java] 상속

상속 • 부모가 자식에게 물려주는 행위 • 자식(하위, 파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것, 자식이 부모를 선택해 물려받는다. • 기존의 클래스를 재사용하여 새로운 클래

haaland09009.tistory.com

 

클래스 간의 관계 - 포함관계

• 상속과 마찬가지로 클래스를 재사용할 수 있는 방법

한 클래스의 멤버변수로 다른 클래스를 선언하는 것

작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만듦

단위 클래스들을 포함관계로 재사용하면 간결하고 손쉽게 클래스 작성 가능

 

~은 ~이다(is-a) : 상속관계 

        ex) sportcar는 car이다. 버스는 자동차이다. 원숭이는 동물이다.

 

~은 ~을 가지고 있다(has-a) : 포함관계

       ex) 원은 점을 가지고 있다. ['원은 점이다'라는 문장보다는 '원은 점을 가지고 있다'라는 문장이 바람직함.] 

              이 포함된 관계.

             

 

 

✍ Engine.java

package ch07;

public class Engine {
	private int displacement;
	private String type;
	Engine() {
		
	}
	Engine(int displacement, String type) {
		this.displacement = displacement; this.type = type;
	}
	void print() {
		System.out.println("=================");
		System.out.println("배기량 : " + displacement);
		System.out.println("엔진타입 : " + type);
	}
}

✍ Car2.java

package ch07;

public class Car2 {
	private Engine eg;  // 포함: 다른 클래스(객체)를 멤버변수/매개변수로 사용 
	private String color;
	Car2() {
		
	}
	Car2(Engine eg, String color) {
		this.eg = eg;
		this.color = color;
	}
	void print() {
		eg.print();
		System.out.println("색깔 : " + color);
	}

}

✍ Car2Ex.java

package ch07;

public class Car2Ex {
	public static void main(String[] args) {
		Engine eg1 = new Engine(2000, "GDI");
		Engine eg2 = new Engine(1500, "DOHC");
		
		Car2 c1 = new Car2(eg1, "빨강");
		Car2 c2 = new Car2(eg1, "초록");
		Car2 c3 = new Car2(eg2, "파랑");
		
		c1.print(); c2.print(); c3.print();
		System.out.println("-----------------------");
		
		Car2[] car = {c1, c2, c3};
		for(int i = 0; i < car.length; i++) {
			car[i].print();
		}
		
		System.out.println("-----------------------");
		Car2[] cars = {c1, c2, c3};
		for(Car2 c : cars) {
			c.print();
		}
	}

}

💻 출력 결과

=================
배기량 : 2000
엔진타입 : GDI
색깔 : 빨강
=================
배기량 : 2000
엔진타입 : GDI
색깔 : 초록
=================
배기량 : 1500
엔진타입 : DOHC
색깔 : 파랑
-----------------------
=================
배기량 : 2000
엔진타입 : GDI
색깔 : 빨강
=================
배기량 : 2000
엔진타입 : GDI
색깔 : 초록
=================
배기량 : 1500
엔진타입 : DOHC
색깔 : 파랑
-----------------------
=================
배기량 : 2000
엔진타입 : GDI
색깔 : 빨강
=================
배기량 : 2000
엔진타입 : GDI
색깔 : 초록
=================
배기량 : 1500
엔진타입 : DOHC
색깔 : 파랑

 ✍ FruitSeller1.java (사과 판매자)

public class FruitSeller1 {
    int numberOfApple = 20;  // 현재 판매자가 보유한 사과의 개수
    int money = 0; // 현재 판매자가 보유한 금액
    final int PRICE_PER_APPLE = 1000; // 사과 하나 당 가격

    int saleApple(int amt) { // 판매한 사과의 수를 반환하는 메서드, amt는 판매자에게 들어온 가격 (수입)
        money += amt;
        int num = amt / PRICE_PER_APPLE;
        numberOfApple -= num; // 현재 판매자가 보유한 사과의 개수
        return num; // 판매한 사과의 수 반환
    }

    void print() {
        System.out.println("================");
        System.out.println("판매자 사과개수: " + numberOfApple); 
        System.out.println("판매자 금전잔액: " + money); 
    }
}

 

✍ FruitBuyer1.java (사과 구매자)

public class FruitBuyer1 {
    int numberOfApple = 0; // 현재 구매자가 보유한 사과의 개수
    int money = 5000; // 현재 구매자가 보유한 금액
    void buyFruit(FruitSeller1 fs, int amt) {
        int num = fs.saleApple(amt); // 구매자가 구매한 사과의 수 = 판매자가 판매한 사과의 수
        numberOfApple += num;
        money -= amt;
    }
    void print() {
        System.out.println("================");
        System.out.println("구매자 사과개수 : " + numberOfApple);
        System.out.println("구매자 금전잔액 : " + money);
    }

}

✍ Fruit1Ex.java (결과 출력)

public class Fruit1Ex {
    public static void main(String[] args) {
        FruitSeller1 fs1 = new FruitSeller1();
        FruitSeller1 fs2 = new FruitSeller1();

        FruitBuyer1 fb1 = new FruitBuyer1();
        FruitBuyer1 fb2 = new FruitBuyer1();
        FruitBuyer1 fb3 = new FruitBuyer1();

        fb1.buyFruit(fs1, 3000);
        fb2.buyFruit(fs2, 2000);
        fb3.buyFruit(fs1, 2000);

        fs1.print(); fs2.print();
        fb1.print(); fb2.print(); fb3.print();
    }
}

💻 출력 

================
판매자 사과개수: 15
판매자 금전잔액: 5000
================
판매자 사과개수: 18
판매자 금전잔액: 2000
================
구매자 사과개수 : 3
구매자 금전잔액 : 2000
================
구매자 사과개수 : 2
구매자 금전잔액 : 3000
================
구매자 사과개수 : 2
구매자 금전잔액 : 3000

✍ FruitSeller3.java

public class FruitSeller3 {
    int numberOfApple, money;
    String name; final int PRICE_PER_APPLE = 1000;

    public FruitSeller3(String name, int numberOfApple, int money) {
        this.name = name; this.numberOfApple = numberOfApple; this.money = money;
    }

    int saleApple(int amt) {
        int num = amt / PRICE_PER_APPLE;
        if (numberOfApple >= num) {
            money += amt;
            numberOfApple -= num;
            System.out.printf("%d개 판매, 수입 %d원\n", num, amt);
        } else {
            System.out.println("사과가 부족합니다.");
            num = 0;
        }
        return num;
    }

    void print() {
        System.out.println("==================");
        System.out.println(name + " 사과개수 : " + numberOfApple);
        System.out.println(name + " 금전잔액 : " + money);
    }
}

 

✍ FruitBuyer3.java

public class FruitBuyer3 {
    int numberOfApple, money;
    String name;

    public FruitBuyer3(String name, int numberOfApple, int money) {
        this.name = name; this.numberOfApple = numberOfApple; this.money = money;
    }
    void buyFruit(FruitSeller3 fs, int amt) {
        if (money < amt) System.out.println("돈이 부족하여 구매할 수 없습니다.");
        else {
            int num = fs.saleApple(amt);
            if (num != 0) {
                numberOfApple += num;
                money -= amt;
                System.out.printf("%s 사과 구매 %d개 지출 %d원\n", name, num, amt);
            } else System.out.println("사과를 구매하지 못했습니다.");
        }
    }

    void print() {
        System.out.println("==================");
        System.out.println(name + " 사과개수 : " + numberOfApple);
        System.out.println(name + " 금전잔액 : " + money);
    }
}

✍ Fruit1Ex3.java

public class Fruit1Ex3 {
    public static void main(String[] args) {
        // 판매자 2명 구매자 3명
        FruitSeller3 fs1 = new FruitSeller3("제니", 30, 1000);
        FruitSeller3 fs2 = new FruitSeller3("로제", 20, 0);
        FruitBuyer3 fb1 = new FruitBuyer3("보검", 0, 20000);
        FruitBuyer3 fb2 = new FruitBuyer3("은우", 5, 10000);
        FruitBuyer3 fb3 = new FruitBuyer3("화사", 0, 50000);


        fb1.buyFruit(fs1, 13000);
        fb2.buyFruit(fs2, 12000);
        fb3.buyFruit(fs1, 15000);
//								 사과  돈
        fs1.print(); 	// 제니   30   1000  -> 27 4000 -> 25 5000
        fs2.print();	// 로제	 20   0   -> 18 2000
        // 보검   0    20000 -> 3 17000
        fb1.print(); 	// 은우   5    10000  -> 7 8000
        fb2.print();    // 화사   0    50000  -> 2 48000
        fb3.print();
    }
}

💻 출력

13개 판매, 수입 13000원
보검 사과 구매 13개 지출 13000원
돈이 부족하여 구매할 수 없습니다.
15개 판매, 수입 15000원
화사 사과 구매 15개 지출 15000원
==================
제니 사과개수 : 2
제니 금전잔액 : 29000
==================
로제 사과개수 : 20
로제 금전잔액 : 0
==================
보검 사과개수 : 13
보검 금전잔액 : 7000
==================
은우 사과개수 : 5
은우 금전잔액 : 10000
==================
화사 사과개수 : 15
화사 금전잔액 : 35000

 

 

/

5/7

'Back-End > JAVA' 카테고리의 다른 글

[Java] collection  (0) 2023.03.11
[Java] Object 클래스, equals(), toString()  (2) 2023.03.11
[Java] 상속  (0) 2023.03.11
[Java] 다형성, 오버라이딩 (1)  (0) 2023.03.10
[Java] 메서드  (0) 2023.03.10