본문 바로가기

Java/자바의 정석 3판

객체지향 프로그래밍(2) - 클래스 간의 관계 설정

클래스 간의 관계를 설정하는 것에는 두 가지 방법이 있다.

첫 번째는 상속 관계를 맺어주는 것이고, 두 번째는 포함 관계를 맺어주는 것이다.

 

 


상속(Inheritance)

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.

class Child extends Parent{
	...
}

조상 클래스 - 상속해주는 클래스

자손 클래스 - 상속 받는 클래스 

 

자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.

따라서, 자손 클래스는 조상 클래스보다 같거나 많은 멤버를 갖는다.

(부모 클래스의 생성자와 초기화 블럭은 상속되지 않는다.)

 

이러한 점에서 상속을 받는 것은 조상 클래스를 확장한다는 의미로 해석할 수 있으며,

상속에 사용되는 키워드가 'extends' 인 이유이다.

 

여러 가지의 클래스를 상속받아 사용하면 좋겠지만, 자바는 기본적으로 단일 상속만을 허용한다.

즉, 조상 클래스로 하나의 클래스만 사용이 가능하다는 것이다.

 

단일 상속만을 허용하는 이유는, 서로 다른 클래스로부터 상속 받은 멤버들 간에 이름이 같을 경우 그것을 구분지을 방법이 없기 때문이다.

 

 


포함(Composite)

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것.

class Circle{
	Point c = new Point();
}

이러한 방법은 클래스들 간의 단위를 작게 나누어 유지보수가 쉽게 만들어 줄 수 있고,

코드가 비교적 간결하여 이해하기 쉽다는 장점이 있다.

 

 


상속 vs 포함 ??

class Circle extends Point{
	int r  
    // 상속. 원(Circle)은 점(Point)이다
}

class Circle{
	Point c = new Point(); 
    // 포함. 원(Circle)은 점(Point)를 가지고 있다.
	int r;
}

두 가지 방법 중에서 어떤 방법으로 클래스의 관계를 설정할 지 혼동이 올 수 있다.

 

이러한 경우에는 아래의 문장에 클래스들을 대입해보자.

 

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

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

 

문장이 자연스럽게 성립하는 쪽으로 클래스들 간의 관계를 설정해주면 된다.

 

하지만..

아직까지 직접 설계를 해본 적이 없는 관계로, 문장을 대입해봐도 아직은 확신이 들지 않는다.

다만, 자바는 단일 상속만을 허용하므로, 기본적으로 포함 관계로 사용하면서 상속은 신중하게 사용해야 할 것 같다는 생각이 든다.

 

 


모든 클래스들의 조상 - Object 클래스

class Tv { // extends Object
	...
}

아무것도 상속 받지 않는 클래스의 경우, 컴파일러가 자동으로 Object 클래스를 상속 받도록 코드를 추가한다.

다른 클래스를 상속 받는 다고 하더라도 상속계층도를 타고 올라가다보면 마지막 최상위 조상은 Object클래스가 된다.

 

따라서, 모든 클래스 들은 Object 클래스의 멤버들을 상속 받기 때문에 Object 클래스의 멤버들을 사용할 수 있다.