IT/JAVA

자바 - 상속(Inheritance)

트레비라임 2020. 11. 16. 15:40

상속(Inheritance)의 개념

  • 부모클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있다. 
  • 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.
  • 처음부터 모든 필드와 메소드를 작성하는 것보다 부모클래스가 가지고 있는 필드와 메소드를 상속받아 추가로 필요한 필드와 메소드를 작성하는 것이 보다 효율적이고 개발시간을 절약할 수 있다.
  • 부모 클래스의 수정으로 모든 자식 클래스들의 수정 효과를 가져오기 때문에 유지 보수 시간을 최소화시켜준다.

 

※ 다른 언어와 달리 자바는 다중 상속을 허용하지 않는다.

class 자식클래스 extends 부모클래스1, 부모클래스2 {
}

 

 

상속을 해도 부모클래스의 모든 필드와 메소드를 물려받는 것은 아니다.

  • 부모클래스에서 private접근 제한을 갖는 필드와 메소드는 상속받을 수 없다.(protected로 변경 시 하위클래스 접근가능 )
  • 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상받을 수 없다.

 

클래스 상속

현실에서 상속은 부고가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다.

class 자식클래스 extends 부모클래스 {
     
      //필드
     //생성자
     //메소드
}

부모 클래스인 Customer클래스를 상속받아 VIPCustomer자식 클래스 설계

 

부모 생성자 호출

자바에서는 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성된다.

모든 객체는 클래스의 생성자를 호출해야만 생성된다.

그렇다면, 부모 객체를 생성하기 위해 부모 생성자를 어디서 호출한 것일까?

부모생성자는 자식 생성자의 맨 첫 줄에서 호출된다.

예를들어 Customer의 생성자가 명시적으로 선언되지 않았다면 컴파일러는 기본 생성자를 생성해 낸다.

 (밑에 보이는 기본 생성자는 내가 임의로 만들 기본생성자이다.)

Customer 부모 클래스의 기본 생성자 

 

VIPCustomer자식 생성자의 맨 첫 줄 super()에서 부모 생성자를 호출한다. 

 

 

 

만약 여러분이 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 다음과 같이 작성하면 된다.

부모클래스에 명시적으로 생성자를 만들었다

기본생성자를 주석 처리하고 명시적으로 매개값이 있는 생성자를 만들었다. 

자식클래스의 생성자 super()에러가 뜬게 보인다.  

super()는 타입이 일치하는 부모 생성자를 호출한다. 하지만 부모클래스 안에는 기본생성자가 주석처리 되어있고 customerID,customerName의 매개값으로 받아 객체를 생성시키는 명시된 생성자만 있기 때문에 타입이 일치하는 생성차를 찾지 못해서 에러가 발생했다. 

그렇기 때문에 Customer을 상속하는 VIPCutomer클래스는 생성자에서 super(customerID,customerName)으로 

Customer 클래스의 생성자를 호출해야 한다.

VIPCutomer클래스의 생성자는 customerID,customerName를매개값으로받아서customerID,customerName다시 부모생성자를 호출하기 위해서 매개값으로 넘겨준다.

 

 

9번을 주석처리하면 'Impicit super constructor Customer() is undefined. Must explicitly invoke anther constructor'라는 컴파일 오류가 발생한다. 이것은 부모의 기본 생성자가 없으니 다른 생성자를 명시적으로 호출하라는 것이다.

 

 

자식 클래스가 생성되는 과정

자식 클래스가 생성 될 때 부모 클래스가 먼저 생성 됨.

부모 클래스의 생성자가 호출되고 자식 클래스의 생성자가 호출 됨.

자식 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우 컴파일러는 부모 클래스 기본 생성자를 호출하기 위한 super()를 추가함.

super()로 호출되는 생성자는 부모 클래스의 기본생성자임.

만약 부모 클래스의 기본생성자가 없는 경우(매개변수가 있는 생성자만 존재 하는 경우) 자식 클래스는 명시적으로  부모 클래스의 생성자를 호출해야 함.

 

 

상위 클래스로 묵시적 형 변환(업캐스팅)

상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성 할 수 있음

하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능 함 상속 상속관계에서 모든 하위 클래스는 상위크래스로 묵시적 형 변환이 됨 그 반대는 성립하지 않음.

VIPCustomer()생성자의 호출로 인스턴스는 모두 생성되었지만

타입이 Customer이므로 접근 할 수 있는 변수나 메서드Customer의 변수와 메서드임.

 

 

상속의 생성자 순서를 확인할 수 있는 예제2

Parent클래스
Child클래스가 Parent 클래스를 상속
Child 객체 생성

child객체를 new 했을 때 부모의 생성자가 먼저 생성된 후에 자식 생성자가 생성된다.