-
JAVA | 상속(Inheritance)programming/JAVA 2020. 5. 21. 23:58
상속(Inheritance) 개념
자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 즉, 자식 클래스가 어떤 부모 클래스를 상속받을 것인지 결정
이때 상속 받는 클래스를 자식(하위 / 서브)클래스 라고 하고 상속을 해주는 클래스를 부모(상위 / 슈퍼) 클래스라고 한다.
자식 클래스가 부모 클래스로부터 상속을 받게 되면 부모 클래스의 필드와 메서드를 물려받게 된다.
* 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외
* 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외
장점
- 중복된 코드를 줄일 수 있다.
- 부모 클래스의 수정으로 모든 자식 클래스들의 수정 효과를 가져오기 때문에 유지 보수 시간을 최소화 시켜준다.
- 통일성이 있고 다형성을 구현할 수 있다.
클래스 상속
현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램은 자식이 부모를 선택한다.
선택된 부모 클래스는 다음과 같이 extends 뒤에 기술한다.
class 자식클래스 extends 부모클래스 { //필드 //생성자 //메소드 }
부모 생성자 호출
현실에서 부모 없는 자식이 있을 수 없듯이 자바에서도 자식 객체를 생성하면, 부모 객체가 먼저 생성되고
자식 객체가 그 다음에 생성된다.
부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다.
public 자식생성자() { super(); }
첫 줄에 super() 는 부모의 기본 생성자를 호출한다.
* 컴파일러에 의해 super()가 자동적으로 추가되기 때문에 부모의 기본 생성자가 존재해야 한다.
메소드의 재정의 (@Override)
부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 좋겠지만 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 이 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용한다.
자바는 이런 경우를 위해 오버라이딩(Overriding) 기능을 제공한다.
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면
오버라이딩된 자식 메소드가 호출된다.
- 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트) 를 가져야 한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다.
- 새로운 예외(Exception)를 throws 할 수 없다.
* 만약 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 경우
- 명시적으로 super 키워드를 붙여서(super.메소드명) 부모 메소드를 호출할 수 있다.
super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있기때문이다.
정리
- 부모 클래스와 자식 클래스는 자바 지정예약어 extends에 의하여 정해진다.
- 하나의 부모클래스는 여러개의 자식 클래스를 가질 수 있다.
- 하나의 클래스는 여러개의 클래스로부터 상속을 받을 수 없다. ( 여러 개의 부모 클래스를 상속할 수 없다. extends 뒤에는 단 하나의 부모 클래스만 와야함) = 단일 상속만 가능
- 자식 클래스는 또 다른 클래스의 부모 클래스가 될 수 있다.
- 자식 클래스는 부모 클래스로 부터 물려받은 자원을 override 하여 수정해서 사용 할 수 있다.
- 부모 클래스가 상속받은 자원도 자식클래스가 사용 가능하다.
참고 : 이것이 자바다 ,
https://commin.tistory.com/101'programming > JAVA' 카테고리의 다른 글
JAVA | 추상 클래스 (0) 2020.05.26 JAVA | 인터페이스(Interface) (0) 2020.05.26 JAVA | 접근 제한자 (public, protected, default, private) (0) 2020.05.21 JAVA | 싱글톤 패턴 (Singleton Pattern) (0) 2020.05.20 JAVA | 클래스 구성(필드, 생성자, 메소드) (0) 2020.05.16