본문 바로가기
old/Java

상속(Inheritance)

by 물 개 2020. 11. 15.

상속이란?

잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 것.

부모 클래스(상위 클래스)의 멤버를 자식 클래스(하위 클래스)에게 물려준다.

단, 부모 클래스의 private 멤버 제외.

부모 클래스와 자식 클래스가 다른 패키지라면 default 멤버도 제외.

final 클래스는 상속 할 수 없다. 부모가 될 수 없는 클래스라는 뜻.

 

클래스 상속

class 자식클래스 extends 부모클래스 {

}

자식 클래스를 컴파일하면 힙영역에 부모 클래스가 먼저 만들어지고 자식 클래스가 만들어진다.

어떻게? 프로그래머가 명시하지 않아도 자식 클래스의 생성자에 부모 클래스 생성자 super(); 를 추가시키기 때문.

부모 클래스의 매개변수 있는 생성자를 사용하고 싶다면 프로그래머가 직접 자식 클래스 생성자에

super(매개변수1, 매개변수2); 처럼 코드를 추가하면 된다.

*super는 부모 객체를 참조하고 있는 키워드이다.

 

메소드 재정의

부모 클래스의 메소드가 자식 클래스에게 적합하지 않을 수도 있다.

이 때 자식 클래스에게 맞게 메소드를 재정의 하는 메소드 오버라이딩(Overriding)기능을 자바는 제공한다.

 

오버라이딩 조건

1. @Override 어노테이션 (필수 x)

2. 부모의 메소드와 동일한 선언부를 가진다.

3. 접근 제한을 더 강하게 할 수 없다.

4. 새로운 예외를 throws 할 수 없다.

5. final 메소드는 오버라이딩 할 수 없다.

 

부모 메소드 호출

자식 클래스에서 상속 받은 메소드를 오버라이딩 했는데, 오버라이딩 전 부모 메소드를 사용하고 싶다면?

super.부모메소드();

으로 부모 메소드를 호출할 수 있다.

 

* 부모 생성자가 private인데 접근할 수 있나요?

있지만 new 키워드로는 불가. 자식 생성자에서 super();로 접근 가능.

 

 

타입 변환과 다형성

다형성이란? 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질.

하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.

자바에서는 부모 클래스로 타입 변환을 허용한다.

즉, 부모 타입 변수에 모든 자식 객체가 대입될 수 있다.

 

자식 클래스 타입이 부모 클래스 타입 변수에 대입되며 부모 클래스 타입으로 변환되는 것은 자동적으로 이루어진다.

즉, 자동 타입 변환(promotion)인 것이다. 이를 다른 말로 업캐스팅이라고도 한다.

하지만 이렇게 업캐스팅이 된 후 객체는 부모 클래스의 멤버만 사용 가능하다. 자식 클래스의 필드, 메서드 사용 불가.

단, 메소드가 오버라이딩 된 경우에는 오버라이딩 된 메소드 사용됨.

왜 업캐스팅을 사용하는가? 다양성을 위해.

필드에 대입될 데이터와 메소드의 매개변수를 다양하게 사용할 수 있게 된다.

 

반대로 부모 클래스 타입이 자식 클래스 타입으로 변환되는 것은 강제적으로만 가능하다.

이것을 다운캐스팅이라고도 한다.

다운캐스팅은 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할때만 가능하다.

즉, 다시 자식 타입에 선언된 필드와 메소드를 사용하고 싶을 때 다운 캐스팅을 사용한다.

 

'old > Java' 카테고리의 다른 글

추상(abstract) 클래스  (0) 2020.11.15
객체의 타입을 확인하는 방법 : instanceof  (0) 2020.11.15
어노테이션(Annotation)  (0) 2020.11.15
접근 제한자(Access Modifier)  (0) 2020.11.15
패키지(package), import문  (0) 2020.11.15

최근댓글

최근글

skin by © 2024 ttuttak