[Java] 상속 - IS-A, super, super(), 오버라이딩(Overriding)
상속
- 부모클래스가 가지는 멤버를 자식클래스가 물려받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술
- 멤버 외에 타입도 상속이 된다.
- 자바는 단일상속만 지원한다. (하나의 클래스만을 부모클래스로 가짐)
- 클래스 간의 상속 시에는 extends 키워드를 사용한다.
ex) public class Academy extends Company{ } //Company가 부모 클래스
장점
- 새로운 클래스를 작성 시 기존에 작성된 클래스의 재사용 가능
- 클래스간 계층 관계가 형성되어 다형성 문법의 토대가 된다.
단점
- 부모클래스의 기능 변경시 자식클래스의 정상적인 동작 유무 예측이 힘들다.
- 자식클래스가 물려받아 사용하는 기능들을 부모클래스에서 변경 시 어려움이 따름
- 부모클래스로부터 물려받은 기능이 자식클래스에서는 무의미 할 수 있다.
- 장단점을 고려해볼 때 IS-A 관계로 구분되는 경우에만 사용해야 한다.
IS-A
- "자식클래스는 (하나의) 부모 클래스이다." 의 관계로 부모클래스의 멤버들을 자식클래스가 상속받는다.
- Circle is a Shape. => Circle 클래스는 하나의 Shape 클래스이다.
super
- 부모클래스의 인스턴스 주소를 보관하는 레퍼런스 변수
- 자식클래스 내의 모든 생성자와 메소드 내에서 부모클래스의 레퍼런스 변수를 사용할 수 있음
super()
- 부모생성자를 호출하는 구문으로 매개변수 타입, 개수, 순서가 일치하는 부모의 생성자를 호출한다.
- this()는 해당 클래스의 생성자를 호출하는 구문이다.
- super()는 부모클래스가 가지는 private 생성자를 제외한 나머지 생성자를 호출하는 구문이다.
오버라이딩 (Overriding)
- 부모클래스에서 상속받은 메소드를 자식클래스가 재정의하여 사용하는 것 (annotation 의 종류)
- 성립조건 : 메소드 이름 동일
메소드 리턴 타입 동일
매개변수의 타입, 개수, 순서가 동일
private 메소드는 오버라이딩 불가능
final 키워드가 사용된 메소드는 오버라이딩 불가능
접근제한자는 부모 메소드와 같거나 더 넓은 범위여야 함
오버라이딩(Overriding) | 오버로딩(Overloading) |
하위 클래스에서 메소드 정의 | 같은 클래스에서 메소드 정의 |
메소드 이름 동일 매개변수 동일(갯수, 타입, 순서) 리턴 타입 동일 |
메소드 이름 동일 매개변수 다름(갯수, 타입, 순서) 리턴 타입 상관 없음 |
자식 메소드의 접근 범위가 부모 메소드의 접근 범위보다 넓거나 같아야 함 |
접근제어자와 상관 없음 |
자식 메소드의 예외처리 수가 부모 메소드의 예외처리 수보다 적거나 범위가 좁아야 함 |
예외처리와 상관 없음 |