Programming Languages/Java

[5장] Java 상속의 개념과 protected 접근 지정

마크투비 2021. 5. 4. 00:50

1. 클래스 상속과 객체

자바의 상속 선언

  • extends 키워드로 선언
    • 부모 클래스를 물려받아 확장한다는 의미
  • 부모 클래스 -> 슈퍼 클래스(super class)
  • 자식 클래스 -> 서브 클래스(sub class)
  • 슈퍼 클래스 객체와 서브 클래스의 객체는 별개
  • 서브 클래스 객체는 슈퍼 클래스 멤버 포함

자바 상속의 특징

  • 클래스 다중 상속(multiple inheritance) 불허
    • C++은 다중 상속 가능
    • C++은 다중 상속으로 멤버가 중복 생성되는 문제 있음
    • 자바는 인터페이스(interface)의 다중 상속 허용

슈퍼 클래스의 멤버에 대한 서브 클래스의 접근

  • 슈퍼 클래스의 private 멤버
    • 서브 클래스에서 접근할 수 없음
  • 슈퍼 클래스의 디폴트 멤버
    • 서브 클래스가 동일한 패키지에 있을 때 접근 가능
  • 슈퍼 클래스의 public 멤버
    • 서브 클래스는 항상 접근 가능
  • 슈퍼 클래스의 protected 멤버
    • 같은 패키지 내의 모든 클래스 접근 허용
    • 패키지 여부와 상관없이 서브 클래스는 접근 가능

 

2. 상속과 생성자

서브 클래스/슈퍼 클래스의 생성자 호출 및 실행

서브 클래스의 객체가 생성될 때

  • 슈퍼 클래스 생성자와 서브 클래스 생성자 모두 실행됨
  • 호출 순서
    • 서브 클래스의 생성자 먼저 호출
    • 서브 클래스의 생성자는 실행 전 슈퍼 클래스 생성자 호출
  • 실행 순서
    • 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자 실행

 

서브 클래스와 슈퍼 클래스의 생성자 선택

  • 슈퍼 클래스와 서브 클래스는 각각 여러 개의 생성자 작성 가능
  • 서브 클래스의 객체가 생성될 때
    • 슈퍼 클래스의 생성자 1개와 서브 클래스 생성자 1개가 실행
  • 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 결정되는 방식
    1. 개발자의 명시적 선택 
      • 서브 클래스 개발자가 슈퍼 클래스의 생성자 명시적 선택
      • super()  키워드를 이용하여 선택
    2. 컴파일러가 기본 생성자 선택
      • 서브 클래스 개발자가 슈퍼 클래스의 생성자를 선택하지 않는 경우
      • 컴파일러가 자동으로 슈퍼 클래스의 기본 생성자 선택
  • 컴파일러에 의해 슈퍼 클래스의 기본 생성자가 묵시적으로 선택됨

  • 슈퍼 클래스에 기본 생성자가 없어 오류가 난 경우

  • 서브 클래스의 매개 변수를 가진 생성자에 대해서도 슈퍼 클래스의 기본 생성자가 선택된다.

  • super()로 슈퍼 클래스의 생성자 명시적 선택
    • 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출
    • 사용 방식
      • super(parameter);
      • 인자를 이용하여 슈퍼 클래스의 적당한 생성자 호출
      • 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함