① 상속
상속이란, super 클래스가 가지고 있는 변수와 메서드를 sub 클래스에게 그대로 물려주는 것이다. 코드로는 class Sub extends Super라고 적는다. Sub 클래스는 상속을 받은 후 본인이 필요한 변수나 메서드를 추가한다. 일반적으로 상속의 목적은 코드의 재활용이라고 알려져 있지만, primary target은 다형성을 위한 것이다.
문법적으로 super class에는 어떤 클래스가 와도 되지만, 상속의 개념을 지키기 위해서는 반드시 IS-A 관계를 만족하는 class를 사용해야 한다.
② Inheritance Rule
1) 상속은 *반드시* IS-A 관계를 만족해야 한다.
extends 대신 is a를 넣었을 때 말이 되지 않는다면, 상속을 걸어서는 안 된다.
ex) laptop is a computer (o), computer is a laptop (x)
laptop is a computer가 말이 된다는 것을 알기 위해서는 컴퓨터랑 노트북이 무엇인지 알아야 한다. 즉, 무엇이 Super이고 무엇이 Sub 인지 구분하려면 Domain knowledge가 있어야 한다. 상속을 잘못 걸면 설계가 깨져버리기 때문에 위 규칙을 만족하는지 잘 살펴보아야 한다.
2) Super와 Sub 중에 Sub를 생성한다.
클래스는 사용하려면 생성을 해야 하는데, Super와 sub 중 어떤 클래스를 메모리에 올려야 할까? 개발자 입장에서는 정보가 많은 Sub 클래스를 올려놓는 것이 좋다.
3) 상속관계에서 Sub 클래스의 인스턴스를 생성할 때는 상속 관계의 최상위 Super 클래스의 생성자부터 순차적으로 실행한다.
이는 Rule이 아니라 Syntax이기 때문에 지키지 않으면 Compile error가 발생한다. Sub 클래스는 상속을 받은 후 본인이 필요한 변수나 메서드를 추가하기 때문에 Super의 초기화가 먼저 이루어져야 Sub의 초기화도 올바르게 이루어질 수 있다.
특히, Private의 제어 범위는 “같은 클래스 내부”이기 때문에 private으로 선언되는 변수는 Sub 클래스가 상속을 받더라도 접근하지 못한다. 상속은 Super 클래스가 가지고 있는 변수와 메서드를 그대로 물려주는 것이지만, 생성자는 주지 않기 때문에 Super 클래스의 생성자를 먼저 호출하여 해당 클래스의 인스턴스를 초기화하여야 한다.
class Man {
String name;
public Man(String name) {
this.name = name;
}
public void tellYourName() {
System.out.println("My name is " + name);
}
}
class BusinessMan extends Man() {
String company;
public BusinessMan(String name, String company) {
super(name);
this.company = company;
}
public void tellYourInfo() {
tellYourName();
}
}
public class MainInheritance {
public static void main(String[] args) {
BusinessMan man = new BusinessMan("hw", "SE");
man.tellYourName();
}
}
위 코드에서 살펴볼 점은 두 가지이다.
첫 번째는 BusinessMan이 가진 변수는 company 1개이지만 Super까지 생각하여 변수를 2개 받았다는 점이다. 이는 평소 개발할 때 염두 해야 하는 부분이다.
두 번째는 tellYourName()과 man.tellYourName의 차이이다. 전자는 reference 변수 없이 메서드를 사용하고 있는데, 이는 상속을 받았기 때문에 나의 메서드를 사용한다는 의미임을 알 수 있다.
③ this vs super
1) this vs super reference variable
this는 현재 자신을 참조하는 reference 변수이다.
super은 한 단계 높은 Super class의 객체를 참조하는 reference 변수이다.
2) this() vs super() method
this()는 같은 클래스 내에 있는 다른 생성자를 호출하는 메서드이다.
super()는 현재 속해 있는 클래스보다 한 단계 높은 Super class의 메서드를 실행시켜주는 메서드이다.
'JAVA' 카테고리의 다른 글
[JAVA] Chapter 11. Inheritance (3) (0) | 2023.07.15 |
---|---|
[JAVA] Chapter 11. Inheritance (2) (0) | 2023.07.14 |
[JAVA] Chapter 10. Array (0) | 2023.07.12 |
[JAVA] Chapter 9. String (0) | 2023.07.11 |
[JAVA] Chapter 8. Class Variable & Class Method (0) | 2023.07.10 |
댓글