YUYANE

Java / 상속 본문

Programming Languages/JAVA

Java / 상속

YUYA 2020. 12. 14. 16:33

상속(inheritance)

1) 거의 모든 사람이 OOP의 핵심이라 여기는 특성

- 재사용성

- 다형성의 기반이 되는 특성

 

2) 어떤 특징을 물려받는다는 의미가 강함(유전)

- 이미 존재하는 클래스(부모 클래스/기반 클래스)를 기반으로 새 클래스(자식 클래스/파생 클래스)를 만드는 방법

  - 기존 클래스의 동작/상태를 그대로 물려 받음(유전)

  - 그 외에 새 클래스만의 동작/상태 추가 가능(진화)

  - 이 새 클래스를 상속해서 또 다른 클래스 생성 가능

  - 자식 클래스는 부모 클래스의 한 종류(is-a 관계)

 

3) 생성자 호출 순서

  - 상속 후에 초기화 할 때 부모/자식 클래스 모두 초기화 해야 한다.

  - 메모리에 개체 생성 -> 부모 클래스 먼저 초기화(부모 생성자 호출) -> 자식 클래스 초기화(자식 생성자 호출)  

   

   자식 클래스에서 부모 클래스를 어떻게 생성할 지 정해져 있지 않은 경우 컴파일러가 알아서 매개 변수가 없는 부모 클래스의 생성자 호출.

   그런데, 부모 클래스의 생성자에 매개 변수가 있다면?

   자식 클래스에서 매개 변수가 있는 부모 클래스의 생성자 호출 (super 사용)

 

  - 부모/자식 클래스 모두 매개 변수가 있다면 순서대로 호출

 

public class Teacher extends Person{
  private Subject subject;
  
  public Teacher(String firstName, String lastName, Subject subject){
    super(firstName, lastName);
    this.department = department;
  }
}

 

4) super

  - 현 개채의 부모 부분을 가리킴

  - super() : 부모의 생성자 호출

  - 멤버 변수나 메서드 호출 시에도 사용 가능

 

5) 부모 클래스의 개체는 자식 클래스의 멤버에 접근 불가

 

그럼 어떻게 부모 멤버에 접근할 수 있을까? 해당 멤버에 접근제어자 protected를 활용할 수 있다.

 

6) 접근 제어자 protected

  - 외부자 접근 불가

  - 클래스 내브, 같은 패키지에 속한 클래스, 자식 클래스만 접근 가능

  - 클래스의 경우 내포된 클래스에 한하여 붙일 수 있음

 

7) 상속의 상속

  - 부모 클래스에 가까워질수록(클래스다이어그램에서 올라갈수록) 일반적(general)

  - 자식 클래스에 가까워질수록(클래스다이어그램에서 내려갈수록) 특정적/구체적(specific)

 

8) 자식을 부모에 대입하는 것은 가능

  - 전자의 경우 암시적 캐스팅 (is-a 관계이므로 가능) 

  - 부모를 자식에 대입하는 것은 케바케 => 컴파일러가 실행 막음

     - 명시적 캐스팅 해줄 때에는 컴파일 실행 ok

 

9) 자식 클래스 간에 캐스팅은 불가능

  - 컴파일러가 상속 관계를 알고 있음

  - 그런데, 자식 클래스 1을 부모 클래스로 대입하고, 그 부모 클래스를 자식 클래스 2로 명시적 캐스팅 하는 것은 컴파일러가 못잡아내서 실행이 된다. 

     - 이런 경우에는 실행 중에 예외 발생 (ClassCastException)

     - 예외처리 없이 해결 방법

         1) 다형성 (나중에 배움)

         2) 부모형 변수에 저장된 개체가 실제 어떤 자식형인지 실행 중에 알 방법 필요

          => RTTI(run time type identification) 기능

              - 매니지드 언어들은 보통 지원

              - 실행 중에 뭔가 더 해야하므로 성능/메모리가 중요한 경우에는 별로인 기능이다

 

10) instanceof 연산자

  - 개체가 특정 클래스의 인스턴스인지 판단하는 연산자

  

11) getClass()

  - instanceof 연산자와 비슷한 기능을 가진 메서드

  - 실행 중에 개체의 클래스 정보 얻어올 수 있음

  - 변수명.getClass()

  - getClass().getName() : 클래스명 반환

     - 이외에도 많은 유용한 메서드가 있다

  - 로그 찍을 때 많이 사용

  - Object 클래스에 있는 메서드

 

12) Object 클래스

  - Java의 모든 클래스의 최상위 클래스

  - RTTI 메서드도 여기에 포함

  - 유용한 메서드 많음 (문서에서 확인 가능)

 

**보통은

  - 자식 개체들을 먼저 만들어보고, 그로부터 공통점을 찾아 부모 클래스를 만든다.

  - 1-2단계 상속 정도만 한다.

  - 깊어질수록 추상화 능력이 더 필요

'Programming Languages > JAVA' 카테고리의 다른 글

Java/ Base Entity  (0) 2020.12.14
Java / is-a , has-a  (0) 2020.12.14
Java / 내포클래스  (0) 2020.12.14
접근제어자  (0) 2020.12.10
JAVA / 아스키코드 (백준 11654)  (0) 2020.11.25
Comments