Loading...

JAVA / / 2022. 1. 20. 13:56

자바 26강. 컴포지션

반응형

상속을 사용하지 않고

객체를 사용하는 방법을 알아보자.

 

package ex11;

class 엔진 {
    int power = 5000;
}

class 소나타 extends 엔진 {

}

public class CompositeEx01 {
    public static void main(String[] args) {
        
    }
}

소나타 클래스에서 power값을 쓰고 싶어서 엔진을 상속받았다.

 

문법적으로 틀린 건 없지만

다형성이 성립되지 않을 때 상속을 사용해선 안된다.

 

이때 데이터를 물려받는 것이 아닌,

재사용하는 방법이 있다.

 

다른 객체를 받아들여서 그 객체의 기능을 사용하는 것이다.

받아들인 객체의 자원(메서드, 변수)을 사용할 수 있다.

 

소나타 클래스는 엔진 클래스가 가진 power 변수를 사용하고 싶을 때,

엔진 클래스를 포함하면 엔진 클래스의 기능을 사용할 수 있다.

이것을 has (포함) 관계라고 한다.

 

상속은 다르다.

상속은 is (같다) 관계라고 한다.

 

has 관계를 만드는 것을

컴포지션(Composition)이라고 한다.

결합하는 것이다.

 

내가 포함하고 싶은것을 생성자로 받아줘야 한다.

 

생성자로 받아주지 않고

소나타 클래스에서 엔진이 사용하고 싶을 때,

엔진 engine = new 엔진();

이렇게 사용하면 안 될까?

 

초기화시키면 받을 수 있는 값이 한정적이기 때문에 선언만 해준다.

이 때문에 소나타는 엔진에 의존적이라고 할 수 있다.

 

추상적인 것에 의존하게 되는 것을 느슨한 결합이라고 하고,

구체적인 것에 의존하게 되면 강한 결합이라고 한다.

package ex11;

class 엔진 {
    int power = 5000;
}

// has 관계를 만드는 법 = 컴포지션
// 생성자로 주입 받기
class 소나타 {

    // has 관계 -> 소나타는 엔진에 의존적이다.
    엔진 engine;    // null

    소나타(엔진 engine) {
        this.engine = engine;
    }
}

public class CompositeEx01 {
    public static void main(String[] args) {
        엔진 e = new 엔진();
        소나타 s = new 소나타(e);
        System.out.println(s.engine.power);
    }
}

 

 

쉽게 이해하기 위한 예시를 보자.

 

너무 잘 만들어져있는 햄버거 클래스가 있다.

치즈 햄버거가 먹고싶어졌을 때는 어떻게 할까?

치즈 햄버거 클래스를 햄버거 클래스에 상속을 해라.

 

그런데 햄버거, 포테이토, 콜라 클래스가 따로 만들어져 있는데,

햄버거 세트를 출시하려고 할 때

상속을 할까?

햄버거 세트가 햄버거인가?

 

아니다.

 

햄버거 세트 클래스에서

필요한 햄버거, 포테이토, 콜라를 컴포지션을 사용해

결합해준다.

 

끝!

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형