🌎 Web/Java

[Java] 상속(inheritance)

오늘 ONEUL 2022. 12. 5. 11:19

07 상속

07-1 상속

시작하기 전에

  • 상속은 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여준다.
  • 부모 클래스 한 번의 수정으로 모든 자식 클래스까지 수정되는 효과가 있어 유지보수 시간이 줄어든다.

 

클래스 상속

  • 자식 클래스 선언 시 부모 클래스를 선택한다.
  • extends 뒤에 부모 클래스 기술한다.
class 자식 클래스 extends 부모 클래스 {
	// 필드
	// 생성자
	// 메소드
}
  • 여러 개의 부모를 상속할 수 없다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드 역시 제외

 

부모 생성자 호출

  • 자식 객체 생성할 때 부모 객체가 먼저 생성되고 이후 자식 객체가 생성된다.
  • 자식 생성자의 맨 첫 줄에서 부모 생성자가 호출된다.
  • 명시적으로 부모 생성자를 호출하려면 super(매개값, …) 메소드를 이용한다.
자식클래스(매개변수선언, ...) {
super(매개값, ...);
...
}
  • super(매개값, …)가 생략되면 부모 클래스에 기본 생성자가 있어야 한다.
  • super(매개값, …)는 반드시 생성자 첫 줄에 위치해야 한다.

 

메소드 재정의(Overriding)

  • 부모 클래스의 메소드가 자식 클래스에서 사용하기 부적합할 경우 자식 클래스에서 수정하여 사용
  • 메소드 재정의 방법
    • 부모 메소드와 동일한 시그니처
    • 접근 제한 더 강하게 재정의 불가능
    • 새로운 예외(Exception)를 throws 할 수 없음
  • 메소드가 재정의될 경우 부모 객체가 숨겨지며, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.

 

부모 메소드 호출

  • 자식 클래스 내부에서 재정의된 부모 클래스 메소드 호출해야 하는 경우, 명시적으로 super 키워드 붙여 부모 메소드 호출한다.
super.부모메소드();

 

final 키워드

  • 해당 선언이 최종 상태이며 수정될 수 없다.
  • 필드 선언 시 final 키워드를 사용하면 초기값 설정 후 더 이상 값을 변경할 수 없음을 의미한다.
  • 클래스메소드 선언 시 final 키워드를 사용하면 상속과 관련이 있다는 의미이다.

 

상속할 수 없는 final 클래스

  • 부모 클래스가 될 수 없어 자식 클래스 만들 수 없음을 의미한다.
  • final 클래스의 가장 대표적인 예는 String 클래스이다.
public final class String {...}
public class NewString extends String {...} // 상속 불가능!

 

재정의할 수 없는 final 메소드

  • 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.
public final 리턴타입 메소드([매개변수, ...]) {...} // 메소드 재정의 불가능!

 

마무리 핵심 포인트

  • 상속: 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 한다.
  • 메소드 재정의(오버라이딩): 부모 메소드를 자식 클래스에서 다시 정의하는 것을 말한다.
  • final 클래스: final 키워드로 선언된 클래스는 부모 클래스로 사용할 수 없는 final 클래스이다.
  • final 메소드: final 키워드로 선언된 메소드는 자식 클래스에서 재정의할 수 없는 final 메소드이다.

 

 

 

※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.