상속
- 상위 클래스는 하위 클래스보다 일반적인 의미를 가짐
- 하위 클래스는 상위 클래스보다 구체적인 의미를 가짐
클래스 상속 문법
class B extends A {
}
- extends 뒤에는 단 하나의 클래스만 사용할 수 있음
- 자바는 single inheritance 만을 지원함
Protected 접근제어자
- 상속 관계에 있을 때, 다른 패키지에 있더라도 Protected 접근 제어자를 이용하여 접근 가능하다.
- private > default (같은 패키지 일때만) > protected > public 순
상속에서 클래스 생성 과정
- 하위 클래스가 생성 될 때 상위 클래스가 먼저 생성됨
- 상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출됨
- 하위 클래스 생성자에서는 무조건 상위 클래스의 생성자가 호출 되어야 함
- 아무것도 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super()를 코드에 넣어줌
- super() 호출되는 생성자는 상위클래스의 기본 생성자
- 만약 상위 클래스의 기본 생성자가 없는경우 (매개변수가 있는 생성자만 존재하는 경우 ) 하위 클래스는 명식적으로 상위 클래스를 호출해야 함
상속에서의 메모리 상태
- 상위 클래스의 인스턴스가 먼저 생성이 되고, 하위 클래스의 인스턴스가 생성 됨
super 예약어
- 하위 클래스가 상위 클래스에 대한 주소를 가짐
- 하위 클래스가 상위 클래스에 접근할 때 사용 가능
상위 클래스로의 묵시적 형 변환 (업캐스팅)
- 상위클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있음
- 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형변환이 가능하다.
형 변환에서의 메모리
- Customer vc = new VIPCustomer();에서 vc가 가리키는 것은 무엇일까?
- VIPCustomer() 생성자의 호출로 인스턴스는 모두 생성되었지만
- 타입이 Customer 이므로 접근한 수 있는 변수나 메서드는 Customer의 변수와 메서드 이다.
메서드 오버라이딩
- 상위 클래스에 정의 된 메서드 중 하위 클래스의 기능이 맞지 않거나 추가 기능이 필요한 경우 같은 이름과 매개변수로 하위 클래스에서 재정의함
가상 메서드 (virtual method)
- 프로그램에서 어떤 객체의 변수나 메스드의 참조는 그 타입에 따라 이루어진다.
- 가상 메서드의 경우 타입과 상관없이 실제 생성된 인스턴스의 메서드가 호출되는 원리
- Customer vc = new VIPCustomer(); , vc.calcPrice(10000); 의 경우 VIPCustomer 클래스의 calcPrice 메서드 호출
다형성 (polymophism)
- 하나의 코드가 여러가지 자료형으로 구현되어 실행되는 것
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
- 객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징
상속은 언제 사용할까?
IS-A 관계 (is a relationship : inheritance)
- 일반적인 (general) 개념과 구체적인 (specific) 개념과의 관계
- 상위 클래스 : 일반적인 개념 클래스 ( 포유류 )
- 하위 클래스 : 구체적인 개념 클래스 ( 사람, 원숭이, 고래.. )
- 단순히 코드를 재사용하는 목적으로 사용하지 않음
HAS-A 관계 (composition)
- 한 클래스가 다른 클래스를 소유한 관계
- 코드 재사용의 한 벙법
- Student 가 Subject를 포함한 관계
class Student {
Subject majorSubject;
}
다운 캐스팅 - instanceof
- 하위 클래스가 상위 클래스로 형 변환 되는 것은 묵시적으로 이루어짐
- 다시 원래 자료형인 하위 클래스로 형 변환 하려면 명시적으로 다운캐스팅을 해야 함
- 이 때 원래 인스턴스의 타입을 체크하는 예약어가 instanceof 임