상속이란?
기존의 클래스를 재사용해 새로운 클래스를 만드는 것.
보다 적은 양의 코드로 새 클래스를 작성할 수 있음.
또한 코드의 공통적인 관리가 가능하기에 추가 및 변경이 용이.
자바에서의 상속
다음과 같이 class 뒤에 extends라는 키워드를 붙이면 된다.
class 42ecole {
}
class 42seoul extends 42ecole {
}
42ecole클래스를 부모 클래스라고 한다.42seoul클래스는 자식 클래스라고 한다.
클래스 간의 상속 관계를 상속계층도로 표현할 수 있다.
상속의 대상
우리는 지금까지 클래스 안에 다음과 같은 것들이 있다고 배웠다.
- 메소드
- 멤버변수
- 생성자
- 초기화 블록
이 중에서 메소드와 멤버변수는 상속되지만, 나머지는 상속되지 않는다.
만약 부모 클래스 안에 멤버변수가 추가되면, 자식클래스에도 그 멤버변수가 자동적으로 추가된다.
그러나, 반대로 자식 클래스 안의 멤버변수/메소드는 부모클래스에 적용되지 않는다.
class 42ecole {
String[] cadet;
}
class 42seoul extends 42ecole {
// string[] cadet은 자동 추가.
}
포함이란?
여러 클래스를 다루는 방법은 상속만 있지 않다.
이번에는 클래스 안에 클래스를 집어 넣는 포함을 알아보자.
class Circle {
int x;
int y;
int z;
}
class Point {
int x;
int y;
}
이 경우 point 클래스를 Circle 클래스 안에 포함시킬 수 있다.
class Circle {
Point c = new Point();
int z;
}
class Point {
int x;
int y;
}
상속 vs 포함
어떨 때 상속을 쓰고, 어떨 때 포함을 써야 하는가?
이럴 때는 각 인스턴스(객체)를 비교해 보는 수 밖에 없다.
예를 들어 아까와 같이 Circle(원)과 Point(점)을 비교해 본다면 다음과 같다.
원은 점을 상속받는다. (상속)
원은 점을 가지고 있다. (포함)
포함관계가 좀 더 적당함을 알 수 있다.
자바에서의 상속
자바에서의 상속은 여러가지 특징이 있다.
단일 상속
자바의 부모 클래스는 한 개다. (C++은 한 개 이상도 가능한다.)
클래스 간의 복잡한 관계를 막기 위해서 걸어 놓은 규칙이라고 할 수 있다.
Object 클래스
자바의 모든 것은 결국 클래스 안에 들어가 있다.
이 경우, 다음과 같은 문제들을 생각해 볼 수 있다.
- 부모 클래스가 없는 클래스는 어떻게 할 것인가?
- 모든 클래스들의 조상은 누구인가?
이 점을 해결하기 위해 Object 클래스라는 것이 나왔다.
모든 부모가 없는 클래스들은 Object 클래스에서 상속을 받는다.
class putstr {
}
// 컴파일러가 알아서 extends Object를 붙인다.
그 결과 굳이 상속을 받지 않아도 기본적으로 쓸 수 있는 메소드가 존재한다.