언어/JAVA

ch05. 상속

rngPwns 2025. 3. 26. 13:37

5.1 상속의 개념

 

5.2 클래스 상속과 객체

 

자바의 상속선언

  • extends 키워드 사용하여 상속선언
  • 상속 부모클래스 : 슈퍼클래스, 상속 자식클래스 : 서브클래스

  • 서브클래스는 슈퍼클래스의 private 멤버 외 모든 멤버에 접근할 수 있다.
  • 자바 상속의 특징
    • 클래스 다중상속 x (C++과 달리). 그러나 인터페이스는 다중상속 가능
    • 자바의 모든 클래스는 자바에서 제공하는 Object 클래스를 자동으로 상속받도록 컴파일된다.

 

5.3 protected 접근 지정

  • 자바의 접근 지정자 : private, public, protected, 디폴트 >>모든 멤버는 이 중 하나로 반드시 지정되어야 함.

  • 디폴트 접근 지정: 접근 지정자가 선언되어 있지 않을 때

protected 멤버

  • 슈퍼클래스의 protected 멤버에 접근 가능한 경우
    1. 같은 패키지에 속한 모든 클래스
    2. 상속되는 서브 클래스(패키지는 상관 x)

 

5.4 상속과 생성자

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

Q. 서브클래스의 객체가 생성될 때 서브클래스의 생성자와 슈퍼클래스의 생성자가 모두 실행되는가? 아니면 서브클래스의 생성자만 실행되는가?

A. 둘 다 실행된다. 생성자의 목적: 객체초기화 이므로 서브클래스의 생성자는 서브클래스의 멤버나 필요한 초기화 수행, 슈퍼클래스의 생성자는 슈퍼클래스의 멤버나 필요한 초기화 각각 수행

 

Q. 서브클래스의 생성자와 슈퍼클래스의 생성자 중 누가 먼저 실행되는가?

A. 슈퍼클래스의 생성자가 먼저 실행된다.  (서브클래스는 자신의 코드 실행 전 슈퍼클래스의 생성자 호출)

 

 

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

  • 슈퍼클래스에 여러 개의 생성자가 있을 수 있음
    • 원칙적으로 서브 클래스의 개발자가 서브클래스의 각 생성자에 대해 함께 실행할 슈퍼클래스의 생성자를 지정해야 한다. 그러나 슈퍼클래스의 생성자를 명시적으로 지정하지 않으면 컴파일러는 묵시적으로 슈퍼클래스의 기본생성자가 호출되도록 컴파일한다.

클래스에 아무 생성자도 선언되지 않은 경우에만 컴파일러에 의해 기본생성자가 강제로 삽입

super()을 이용하여 명시적으로 슈퍼 클래스의 생성자 선택

  • 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 선택하는 것이 원칙
  • super()을 이용하면 서브 클래스의 생성자에서 슈퍼 클래스 생성자를 명시적으로 선택할 수 있음
  • super() = 슈퍼 클래스 생성자의 호출 - 괄호 안에 매개변수를 주어 매개변수를 가진 슈퍼클래스의 생성자 호출 가능

 

 

5.5 업캐스팅과 instanceof 연산자

  • 캐스팅(casting) : 타입 변환 - 자바에서 클래스에 대한 캐스팅은 업캐스팅(upcasting)과 다운캐스팅(downcasting)으로 나뉜다.

업캐스팅

  • 서브클래스는 슈퍼클래스의 속성 상속, 서브클래스는 슈퍼클래스로 취급될 수 o
  • 업캐스팅: 서브클래스 객체가 슈퍼클래스 타입으로 변환되는 것

슈퍼클래스의 레퍼런스 p가 서브클래스 객체를 가리키도록 치환되는 것

  • 업캐스팅으로 통해 p는 Student 객체를 가리키고 있다. 그러나 p는 Person 타입이기에 p로는 Person 클래스의 멤버만 접근할 수 있다. (슈퍼클래스의 레퍼런스 p가 서브클래스 객체를 가리키도록 치환되는 것이 업캐스팅.)

업캐스팅한 레퍼런스로는 객체 내에 실존하는 모든 데이터에 접근 불가. 슈퍼클래스의 멤버만 접근 가능

  • Student 객체가 Person타입으로 업캐스팅되면 Person 클래스 객체로 취급되며 Student클래스의 필드 or 메소드 접근불가.
  • 업캐스팅은 명시적 타입변환을 하지 않아도 됨(Student 객체는 Person타입이기도 하기 때문)