반응형

포함 관계

포함(composite)이란?

  • 클래스의 멤버로 참조변수를 선언하는 것

클래스들 간의 관계는 크게 상속 포함 2가지로 나눌 수 있다. 저번시간에 상속을 공부했고, 오늘은 포함을 알아보자.

포함관계란, 클래스의 멤버로 참조변수를 선언하는 것을 말한다.

 

코드를 보면, 이런 것이 포함이다

Cirlce 클래스를 만들 때, 원을 표현하기 위해, 원점의 x좌표, 원점의 y좌표, 반지름 r을 멤버가 있어야 하는데,
좌측의 코드처럼 작성할 수도 있지만, 상속을 이용하여 오른쪽처럼 코드를 작성할 수 있다.

좌측코드는 Point클래승화 전혀 관계가 없다.

그러나, 오른쪽 코드는 Circle클래스와 Point클래스가 서로 포함관계에 있다.
Point클래스를 Cirlce에 포함시킨 것이다.

포함은, 이처럼 클래스의 멤버로 다른 클래스타입의 참조변수를 선언하고, 그 타입의 객체를 만들어 주는 것이다.

 

예를 들어서, Circle c = new Circle(); 이렇게 객체를 만들어 주었을 때,
1번코드와 2번코드가 어떻게 차이가 있는지 그림으로 알아보자.

1번코드는, 참조변수 c를 선언하고, iv가 3개인 객체를 생성하고, 0으로 초기화된다. 그리고 해당 객체의 주소가 참조변수 c에 저장된다.

2번코드는, 일단 참조변수 c가 만들어지고, 멤버가 2개이다. 하나는 c, 하나는 r.
그리고 객체의 iv인 c는 참조변수이므로 기본값인 null로 초기화된다. 그리고 r은 integer이므로 0으로 초기화 된다. 그리고 참조변수 c에 객체의 주소값이 저장된다.
그리고 명시적 초기화가 되어  point객체가 만들어지는데, iv가 2개인 객체가 만들어지고, x와 y는 integer타입이므로 0으로 초기화 된다.
그리고 이객체의 주소가 참조변수 c가 가리키고 있는 객체의 iv c에 저장되게 된다. null이 주소로 바뀐다.

2번코드에서 x와 y로 접근하려면, c.c.x 그리고 c.c.y이다.

1번코드와 2번코드의 저장공간은 총 3개로 동일하다.
다만, 구조적인 차이가 있다.

이 두 경우에 이러한 차이가 있다는 것을 잘 알아두자.

 

  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.

이 Car는 Engine과 Door를 포함했다.
이런식으로, 자동차를 만들 때, 멤버들을 전부 일일이 쓰는 것 보다는,
Engine이나 Door처럼 작은 단위의 클래스를 만들고 그것들을 포함시켜서 자동차를 만들면 복잡도가 줄어든다.
그리고 Engine이나 Door가 다른 클래스에 쓰일 수도 있을 것이다.

 


 

클래스 간의 관계 결정하기

지금까지 클래스 상속과 포함을 공부했는데,
클래스간의 관계를 결정해줄 때, 언제 상속으로하고, 언제 포함으로 할지 어떻게 결정할까?

가장 간단한 방법은 문장을 만들어 보는 것이다.

A는 B이다.
A는 B를 가지고 있다.  이렇게 두개의 문장을 만들어봐서, 둘중에 어떤게 더 자연스러운지 보는 것이다.

 

이렇게 Point라는 클래스가 있을 때,


Circle클래스를 만들 때 이 Point클래스와 Circle클래스의 관계를 어떻게 맺어줘야 할까?

잘 모르겠을 때는, 문장을 만들어 보면 된다.

원은 점이다. - Circle is a Point.
원은 점을 가지고 있다. - Circle has a Point

포함관계가 더 잘 맞는다. 
따라서 이런 경우에는 Circle과 Point클래스의 관계를 포함관계로 하는 것이 더 적합하다.

꼭 이 방법이 절대적인 것은 아니고, 가장 간단한 방법이라서 예시로 들었다.

 

위의 각 클래스를 가지고 Circle c = new Circle(); 객체생성과정을 그림으로 그려보면 어떻게 될까?

 

반응형

'JAVA' 카테고리의 다른 글

오버라이딩 (overriding)  (0) 2022.03.30
단일 상속, Object 클래스  (0) 2022.03.30
상속  (0) 2022.03.30
변수의 초기화, 멤버 변수의 초기화  (0) 2022.03.29
생성자 this(), 참조변수 this  (0) 2022.03.29