●상속
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 함께 써주기만 하면 된다.
class Parent { }
class Child extends Parent {
// ...
}
위의 두 클래스는 상속관계에 있다고 하며 상속하는 클래스(Parent)는 '조상 클래스'라 하고 상속받는 클래스(Child)는 '자손 클래스'라 한다. 만일 Parent클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손클래스는 조상의 멤버를 모두 상소받기 때문에, Child클래스는 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다.
class Parent {
int age;
}
class Child extends Parent{ }
이번엔 반대로 자손인 Child클래스에 새로운 멤버로 play() 메서드를 추가해보자.
class Parent {
int age;
}
class Child extends Parent {
void play() {
System.out.println("놀자~");
}
}
코드와 코드에 관한 상속계층도를 통해 조상클래스(Child)에 코드가 추가되어도 자손클래스(Parent)에 아무런 영향을 미치지 않는 걸 이해 할 수 있다. 이를 통해 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만, 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못하는 걸 알 수 있다. 또한 자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상클래스보다 같거나 많은 멤버를 갖는다. 상속에 관한 주요한 개념을 정리해보면 다음과 같다
- 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다. (단, 생성자와 초기화 블럭은 상속되지 않는다.)
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
●단일 상속
다른 객체지향언어들과 다르게 자바는 단일 상속만을 허용한다. 다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만, 클래스간의 관계가 매우 복잡해진다는 것과 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다. 다중상속을 허용해서 TvDVD클래스가 Tv클래스와 DVD클래스를 모두 조상으로 하여 두 클래스의 멤버들을 상속받는다고 가정해보자.
만약 Tv클래스에도 power()라는 메서드가 있고, DVD클래스에도 power()라는 메서드가 있을 때 자손인 TvDVD클래스는 어느 조상클래스의 power()를 상속받게 되는 것일까? 결론은 알 수가 없다. 이처럼 다중상속은 상속받는 멤버변수의 클래스가 불분명하다는 단점이 있다. 자바에서는 이러한 다중상속의 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만을 허용한다. 단일 상속을 통해 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만든다.
●Object클래스 - 모든 클래스의 조상
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
class Tv {
...
}
위의 코드를 봤을 때 Tv클래스는 아무런 클래스도 상속받지 않는 것 같다. 하지만 Object는 모든 클래스의 조상이다. Object 클래스를 적지 않아도 자바 컴파일러는 자동적으로 'extends Object'를 추가하여 Tv클래스가 Object클래스로부터 상속받도록 한다. Object클래스는 모든 클래스의 조상이기 때문에 상속의 최상단부에는 Object클래스가 존재한다.
class Tv { // extends Object가 자동 추가됨
...
}
class SmartTv extends Tv {
...
}
출처:자바의 정석 기초편(저자: 남궁성, 출판사:도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] super와 super() (0) | 2021.07.14 |
---|---|
[객체지향]오버라이딩(overriding) (0) | 2021.07.13 |
[객체지향] 변수, 멤버변수의 초기화 (0) | 2021.07.12 |
[객체지향] this()와 this (0) | 2021.07.12 |
[객체지향] 생성자 (0) | 2021.07.12 |