자바의 정석 ch7 요약
정의
: 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
장점
1. 상속을 통해서 클래스를 작성하면 적은 양의 코드로 새로운 클래스 작성이 가능하다.
2. 코드를 공통적으로 관리할 수 있어 코드의 추가 및 변경이 매우 용이하다.
3. 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
사용법
새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 "extends"와 함께 써준다.
EX code
class Child extends Parent {
//...
}
class Child와 class Parent는 상속 관계에 있다고 말하며,
상속해주는 클래스를 조상 클래스라고 하고, 상속 받는 클래스를 자손 클래스라고 한다.
조상 클래스 : 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
자손 클래스 : 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스
상속관계를 그림으로 표현한 것을 상속계층도(class hierarchy)라고 한다.
자손 클래스는 조상 클래스이 모든 멤버를 상속받기 때문에, Child class는 Parent class의 멤버들을 포함한다고 할 수 있고, 다음과 같이 표현할 수 있다.
Parent class가 변경되면, Child class도 자동으로 영향을 받지만,
자손 클래스가 변경되는 것은 Parent class에 아무 영향도 못 끼친다.
상속의 특성
1. 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
2. 자속 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
3. JAVA에서의 상속은 단일 상속(single inheritance)만 허용한다.
상속 EX Code
class Tv {
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class CaptionTv extends Tv {
boolean caption;
void displayCaption(String test) {
if(caption)
System.out.println(text);
}
}
class CaptionTvTest {
public static void main(String args[]){
CaptionTv ctv = new CaptionTv();
ctv.channel = 10;
ctv.channelUp();
System.out.pringln(cvt.channel);
ctv.caption = true;
ctv.displayCaption("Hello World");
}
}
다음과 같이 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
: 포함관계란 한 클래스의 멤버변수로 다른 클래스 타입의 참조 변수를 선언하는 것을 말한다.
class Point{
int x;
int y;
}
class Circle {
Point c = new Point(); // 원점
int r; // 반지름
}
다음은 class Circle이 class Point를 멤버 변수로 선언하였기 때문에 포함관계에 있다고 말할 수 있다.
클래스를 작성하는데, 상속관계를 맺어줄 것인지 포함 관계를 맺어 줄 것인지 결정하는 것은 혼란스럽다.
두 관계를 결정하기 위해서 다음의 사항을 따르면 된다.
포함 관계 : ~은 ~을 가지고 있다. (has - a)
상속 관계 : ~은 ~이다. (is - a )
무조건적으로 따르는 것은 아니지만 어느정도 관계를 결정하는데 도움이 된다.
EX)
원(Circle)은 점(Point)이다. - Circle is a Point
원(Circle)은 점(Point)을 가지고 있다. Circle has a Point ( 더 자연스러움 )
EX Code
class DeckTest {
public static void main(String args[]) {
Deck d = new Deck(); // 카드를 한 벌(deck)을 만든다.
Card c = d.pick(0); // 섞기 전에 제일 위의 카드를 뽑는다.
System.out.println(c);
d.shuffle(); // 카드를 섞는다.
c = d.pick(0); // 섞은 후 제일 위의 카드를 뽑는다.
System.out.println(c);
}
class Deck {
final int CARD_NUM = 52;
Card cardArr[] = new Card[CARD_NUM];
Deck() {
int i=0;
for(int k=CARD_NUM; k > 0; k--)
for(int n=0; n<Card.Num_MAX; n++)
cardArr[i++] = new Card(k, n+1);
}
Card pick(int index) {
return cardArr[index];
}
Card pick() {
아이 귀찮앙
: Object class는 상속계층도의 최상위에 있는 조상 클래스이다. 다른 클래스롭터 상속 받지 않는 모든 클래스들은 자동적으로 Object class로부터 상속받는다.