경주장

6주차 과제: 상속 #6 (~02.29) - final, super 키워드 본문

JAVA/whiteship_live-study

6주차 과제: 상속 #6 (~02.29) - final, super 키워드

달리는치타 2022. 2. 23. 00:31

 학습할 것 (필수)

  • 자바 상속의 특징
  • 메소드 오버라이딩
  • final 키워드
  • super 키워드
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • Object 클래스

final 키워드는 세가지 위치에서 활용됩니다.

  • 클래스 선언부
  • 필드
  • 메소드

이때 필드에 선언되는 final 키워드는 불변을 의미합니다.

  • instance 필드의 경우 생성시 값이 채워지고 이후의 불변을 보장하며
    • 필드 초기화 or 생성자 초기화 필수
  • static(클래스) 필드의 경우 final 키워드와 함께 사용되면 상수 (constant)의 의미로 사용됩니다.
    • 필드 초기화 필수

 

생성자를 통해 초기화되는 final Instance 필드를 포함한 클래스를 상속한 subclass의 경우 자신의 생성자의 첫번째 라인에 super( ) 생성자를 통해 부모의 final 필드를 초기화 해야합니다.

class Member {
    static final String classID = "Member-Class";
    final String username;

    Member(String username) {
        this.username = username;
    }
}

class PasswordMember extends Member{
    String password;

    PasswordMember(String username) {
        super(username);
    }
}

Member에 선언된 상수는 PasswordMember에서 호출 할 수 없습니다. (상속 안됨)


  • 메서드에 포함된 final 키워드는 subclass에 의해 override될 수 없음을 의미합니다.
  • 클래스의 선언부에 포함된 final 키워드는 subclass를 가질 수 없음을 의미합니다.

 

 

필드에 사용하는 final 키워드와 다르게 일반적인 application을 만드는데는 잘 활용되지 않고 Framework와 같은 것을 만들때 활용됩니다.

 


super 키워드는 두가지 방식으로 활용됩니다.

  • Accessing Superclass Members     - super.field, super.method()
  • Subclass Constructors                - super( )

 

this 키워드와 유사합니다. superclass의 member(인스턴스 필드와 메소드)를 접근하는 객체 포인터로 활용될 수 있으며 superclass의 생성자를 호출하기위해 사용될 수 있습니다.

 

super.method( )를 활용하면 subclass에서 override할때 super클래스의 구현을 효과적으로 차용할 수 있습니다.

 


super( )를 통해 subclass의 생성자 구현시 superclass의 field의 초기화를 superclass의 생성자를 활용하여 편리하게 할 수 있습니다. 모든 subclass (그러니까 Object를 제외한 자바의 모든 class)는 자신의 생성자의 첫번째 라인에 superclass의 생성자를 호출해야합니다. 명시적으로 작성하지 않는다면 superclass의 기본 생성자가 자동으로 추가됩니다.

 

만약 superclass의 기본 생성자(파라미터가 하나도 없는 생성자)가 없다면 subclass 생성자의 첫번째 줄에 꼭 명시적으로 super( ... )를 호출해야 합니다.

Member 클래스 역시 Object의 생성자를 super()를 통해 호출하고 있었다!!