보리차
chapter 14 클래스의 상속 1: 상속의 기본 본문
상속에 대한 오해
상속은 코드의 재활용을 위한 문법이 아니다.
상속은 연관의 일련된 클래스들에 대해 공통적인 규약을 정의하는 것이다.
상속의 가장 기본적인 특성
기존에 정의된 클래스에 메소드와 변수를 추가하여 새로운 클래스를 정의하는 것이다.
상속과 생성자
class Man {
String name;
}
class BusinessMan extends Man {
String company;
String position;
public BusinessMan(String name, String company, String position) {
// 상위 클래스 Man의 맴버 초기화
this.name = name;
// 클래스 BusinessMan의 맴버 초기화
this.company = company;
this.position = position;
}
}
상위 클래스인 Man을 상속하는 하위 클래스인 BusinessMan에서 상위 클래스의 변수를 함께 초기화해줘야한다.
그러나 위 코드는 상위 클래스에 생성자가 정의되어 있지 않으므로 적절한 생성자의 정의 형태는 아니다.
그렇다면 뭐가 상속관계에서 적절한 생성자 정의일까?
class SuperCLS {
public SuperCLS() { // 생성자
System.out.println("I'm Super Class");
}
}
class SubCLS extends SuperCLS {
public SubCLS() { // 생성자
System.out.println("I'm Sub Class");
}
}
class SuperSubCon {
public static void main(String[] args) {
new SubCLS();
}
}
// I'm Super Class
// I'm Sub Class
위의 실행결과는 다음 사실을 알려준다
- 하위 클래스의 인스턴스 생성 시 상위 클래스, 하위 클래스의 생성자 모두 호출된다.
- 하위 클래스의 인스턴스 생성 시 상위 클래스의 생성자가 먼저 호출된다.
상속 관계에 있는 두 클래스의 적절한 생성자 정의
자바는 상속 관계에 있을지라도, 상위 클래스의 멤버는 상위 클래스의 생성자를 통해서 초기화하도록 유도하고 있다.
class Man {
String name;
public Man(String name) {
this.name = name;
}
}
class BusinessMan extends Man {
String company;
String position;
public BusinessMan(String name, String company, String position) {
super(name); // 상위 클래스의 생성자 호출
this.company = company;
this.position = position;
}
}
단일 상속만을 지원하는 자바
자바는 프로그램이 과도하게 복잡해지는 것을 막기 위해 단일 상속만을 지원한다.
그러나 다음과 같이 상속의 깊이를 더하는 것은 가능하다.
class AAA {...}
class MMM extends AAA {...}
class ZZZ extends MMM {...}
클래스 변수, 클래스 메소드와 상속
클래스 변수와 클래스 메소드는 인스턴스에 속하지 않는, 딱 하나만 존재하는 변수와 메소드이다. 따라서 상속의 대상이 아니다.
상위 클래스에 위치한 클래스 변수와 메소드에 하위 클래스에서 어떻게 접근하는가?
- 변수의 이름만으로 접근이 가능하다. 단, 선언된 접근 수준 지시자가 접근을 허용해야 가능
class SuperCLS {
protected static int count = 0; // protected는 하위 클래스 접근을 허용
public SuperCLS() {
count++;
}
}
class SubCLS extends SuperCLS {
public void showCount() {
// 상위 클래스에 위치한 클래스 변수 count에 접근
System.out.println(count);
}
}
class SuperSubStatic {
public static void main(String[] args) {
SuperCLS obj1 = new SuperCLS(); // count 값 1 증가
SuperCLS obj2 = new SuperCLS(); // count 값 1 증가
// 아래 인스턴스 생성 과정에서 SuperCLS 생성자 호출되므로,
SubCLS obj3 = new SubCLS(); // count 값 1 증가
obj3.showCount();
}
}
// 3 출력
'Java' 카테고리의 다른 글
chapter 16 클래스의 상속 3: 상속의 목적 (0) | 2022.02.06 |
---|---|
chapter 15 클래스의 상속 2: 오버라이딩 (0) | 2022.01.28 |
chapter 13 배열(Array) (0) | 2022.01.28 |
chapter 12 콘솔 입력과 출력 (0) | 2022.01.26 |
chapter 11 메소드 오버로딩과 String 클래스 (0) | 2022.01.26 |