상속 Inheritance란?
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다.
자식 클래스는 부모 클래스의 모든 멤버를 상속 받습니다.
새로운 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 extends와 함께 써주면 됩니다.
상속은 기존 클래스를 이용해 새로운 클래스를 만들 수 있기 때문에 코드의 중복을 제거하고 재사용성을 높이며, 코드를 공통적으로 관리할 수 있기 때문에 프로그램의 생산성과 유지보수에 좋습니다.
- 부모 클래스(Parent Class): 조상 클래스, 상위 클래스(Super Class), 기반 클래스(Base Class)
- 자식 클래스(Child Class): 자손 클래스, 하위 클래스(Sub Class), 파생된 클래스(Derived Class)
생성자와 초기화 블럭은 상속되지 않으며, 부모 클래스의 멤버만 자식 클래스에게로 상속됩니다.
자식 클래스는 새로운 멤버를 추가할 수 있기 때문에 자식 클래스의 멤버 개수는 부모 클래스의 멤버 개수보다 같거나 많습니다.
//부모 클래스
class Tv {
boolean power;
int channel;
void power();
void channelUp();
void channelDown();
}
//자식 클래스
class CaptionTv extends Tv {
boolean caption;
void displayCaption(String text) {
if (caption) {
System.out.println(text);
}
}
}
클래스 간 관계
- 포함관계(has-a): A는 B를 가지고 있다.
상속 외에도 클래스를 재사용할 수 있는 방법 중 하나입니다.
A 클래스의 멤버변수로 B 클래스 타입의 참조변수를 선언하는 방법입니다.
ex) Circle has a Point
class Circle {
Point center = new Point();
int r;
}
class Point {
int x;
int y;
}
- 상속관계(is-a): B 클래스는 A이다.(B = 자식 클래스, A = 부모 클래스)
ex) Circle is a shape
class Shape {
String color = "black";
void draw() {
System.out.printf("color = %s", color);
}
}
class Circle extends Shape {
Point center;
int r;
//오버라이딩
void draw() {
System.out.printf("center = (%d, %d), r = %d, color = %s", center.x, center.y, r, color);
}
}
단일 상속 Single Inheritance
C++는 여러 부모 클래스를 상속하는 다중 상속(Multiple Inheritance)이 가능하지만, 자바에서는 단일 상속만 허용합니다.
다중 상속을 허용하면 여러 클래스로부터 상속을 받을 수 있어 복합적인 기능을 가진 클래스를 쉽게 만들 수 있다는 장점이 있지만, 그만큼 클래스 간 관계가 복잡해지는 단점이 있습니다.
서로 다른 클래스로부터 상속받은 멤버의 이름이 같다면 구별할 수 있는 방법이 없다는 단점이 있습니다.
만약 인스턴스 메서드의 이름이 같을 때, 구별하기 위해서 부모 클래스의 메서드 이름을 바꾸면 상속하는 다른 모든 클래스에서도 메서드 이름을 변경해줘야 하기 때문에 복잡해지게 됩니다.
따라서 자바에서는 다중 상속의 장점을 포기하고 단일 상속만 허용합니다.
단일 상속만 사용하기 때문에 클래스 간 관계가 보다 명확해지는 장점이 있습니다.
Object 클래스
Object 클래스는 모든 클래스 상속계층도의 최상위에 위치한 조상 클래스입니다.
다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속 받게 됩니다.
자바 코드를 컴파일 하면 컴파일러는 상속 받지 않은 클래스의 이름 뒤에 extends Object를 추가합니다.
이미 어떤 클래스로부터 상속받아 작성된 클래스의 경우 컴파일러는 extends Object를 추가하지 않습니다.
//컴파일 전
class Tv {
//...
}
//컴파일 후
class Tv extends Object {
//...
}
toString(), equals(Object o)와 같은 메서드를 따로 정의하지 않고도 사용할 수 있었던 이유는 해당 메서드들이 Object 클래스에 정의된 것이기 때문입니다.
참고
- 참고 도서: Java의 정석 - 남궁성 지음
'Java' 카테고리의 다른 글
제어자 Modifier (0) | 2022.05.20 |
---|---|
super와 this (0) | 2022.05.20 |
오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2022.05.19 |
객체지향 프로그래밍(OOP, Object-Oriented Programming) (0) | 2022.05.19 |
배열 Array (0) | 2022.05.19 |