7.1 상속(inheritance)
1. 상속의 정의와 장점
▶ 상속이란?
- 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것
- 두 클래스를 조상과 자손으로 관계를 맺어주는 것
- 자손은 조상의 모든 멤버를 상속 받는다. (생성자와 초기화 블럭은 제외한다.)
- 자손의 멤버개수는 조상보다 적을 수 없다. (같거나 많아야 한다.)
class 자손클래스 extends 조상클래스{
// ...
}
2. 클래스간의 관계 - 상속관계(inheritance)
- 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.
- 조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다.
2. 클래스간의 관계 - 포함관계(composite)
▶ 포함(composite)이란?
- 한 클래스의 멤버변수로 다른 클래스를 선언하는 것
- 작은 단위의 클래스를 먼저 만들고, 이들을 조합해서 하나의 커다란 클래스를 만든다.
class circle{
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int r; // 반지름(radius)
}
class Point{
int x;
int y;
}
class circle{
Point c = new Point(); // 원점
int r; // 반지름(radius)
}
3. 클래스간의 관계결정하기 - 상속 VS 포함
- 가능한 많은 관계를 맺어주어 재사용성을 높이고 관리하기 쉽게 만든다.
- 'is - a'와 'has - a'를 가지고 문장을 만들어 본다.
원(circle)은 점(point)이다.
원(circle)은 점(point)을 가지고 있다.
상속관계 - '~은 ~이다. (is ~ a)'
포함관계 - '~은 ~을 가지고 있다. (has ~ a)'
Ex) 클래스간의 관계결정
- 원은 도형이다. -> 상속관계
- 원은 점을 가지고 있다. -> 포함관계
class Deck{
final int CARD_NUM = 52;
Card c[] = new Card[CARD_NUM]
Deck(){
int i = 0;
for (int k = Card.KIND_MAX; k > 0 ; k-- ){
for(int n = 1; n<Card.NUM_MAX+1;n++){
c[i++] = new Card(k,n);
}
}
}
Card pick(int index){
return c[index%CARD_NUM] //지정된 위치에 있는 카드 하나를 선택한다.
}
Card pick(){
int index = (int)(Math.random()*CARD_NUM); // 덱에서 카드를 하나 선택한다.
return pick(index)
}
void shuffle() { // 카드 순서 섞기
for(int n = 0l n < 1000; n++){
int i = (int)(Math.random()*CARD_NUM);
Card temp = c[0];
c[0] = c[i]
c[i] = temp
}
}
}
4. 단일 상속(single inheritance)
자바는 단일 상속만을 허용한다 (C++의 경우엔 다중상속을 허용한다.)
class TVCR extends TV, VCR{ //이와 같은 표현 허용 X
//...
}
5. Object 클래스 - 모든 클래스의 최고조상
- 조상이 없는 클랫는 자동적으로 Object 클래스를 상속받게 된다.
- 상속계층도의 최상위에는 Object 클래스가 위치한다.
- 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다. toString(), equals(Object obj), hashCode(), ....
'Java > 객체지향' 카테고리의 다른 글
[객체지향][자바의 정석] - 7.4 제어자 (0) | 2021.11.11 |
---|---|
[객체지향][자바의 정석] - 7.2 오버라이딩(Overriding) (0) | 2021.11.08 |
자바의 정석 제 6장 정리 (0) | 2021.11.04 |
[객체지향][자바의 정석] - 5. 변수의 초기화 멤버변수의 초기화 (0) | 2021.11.02 |
[객체지향][자바의 정석] - 6.4 생성자 (0) | 2021.11.01 |