지구정복

[JAVA] 상속 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 상속

eeaarrtthh 2020. 10. 28. 22:35
728x90
반응형

상속은 부모가 자식에게 물려주는 행위를 말한다.

 

객체 지향 프로그래밍에서도 부모클래스의 멤버를 자식클래스에게 물려줄 수 있다.

 

프로그램에서는 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스라고 부른다.

 

상속은 이미 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여주고

 

부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화한다.

 

ㅁ클래스 상속

현실에서는 부모가 자식을 선택해서 상속하지만 프로그램에서는 자식이 부모를 선택한다.

 

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스는 다음과 같이 extends를 

 

기술한다.

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

 

자바에서 상속은 다음과 같은 특징을 가진다.

 

 1. 여러 개의 부모 클래스를 상속할 수 없고 extends 뒤에는 오로지 하나의 부모 클래스만 와야 한다.

 

 2. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 

    그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도

    상속 대상에서 제외된다.

 

다음은 예제 코드이다.

아래 예제처럼 자식 클래스에서 부모 클래스를 상속받으면 부모 클래스의 필드와 메소드를 사용할 수 있다.

부모 클래스
자식 클래스
자식 클래스 사용

ㅁ부모 생성자 호출

DmbCellPhone dmb = new DmbCellPhone("java", "bloack", 10);

위에 코드에서 dmb 객체를 생성하면 메모리상에는 부모 클래스인 CellPhone 의 객체가 먼저 생성된 후에 

자식 객체가 생성된다.

 

실제로 적지는 않아도 컴파일러는 다음과 같은 기본 생성자를 생성한다.

super() 는 부모의 기본 생성자를 호출한다.

public DmbCellPhone() {
    super();
}

 

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

super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. 

자식클래스(매개변수선언, ...) {
    super(매개값, ...);
    ...
}

주의할 점은 super()는 반드시 자식 생성자 첫 줄에 위치해야 하며, 그렇지 않을 경우 컴파일 에러가 발생한다.

 

다음 예제를 살펴보자.

부모 클래스
자식 클래스
자식 객체 사용
출력 결과

 

 

ㅁ메소드 재정의

부모 클래스의 메소드를 자식 클래스에서 사용하기 부적합한 경우 자식 클래스에서 부모 클래스의 메소드를 재정의할 수 있다.

이를 메소드 재정의(Overriding)이라고 한다.

 

ㅇ메소드 재정의하는 방법

먼저 메소드 재정의할 때는 다음과 같은 규칙이 있다.

 

 - 부모의 메소드와 동일한 시그너처(리턴타입, 메소드 이름, 매개변수 목록)를 가져야 한다.

 - 접근 제한을 더 강하게 재정의할 수 없다.

    * 만약 부모 메소드가 public 접근 제한을 가질 경우 재정의하는 자식 메소드는 default나 private 접근 제한을

      사용할 수 없다. 다만 반대로 부모 메소드가 default일 경우 자식 메소드는 default나 public을 사용가능하다.

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

 

메소드가 재정의되면 부모 객체의 메소드는 숨겨지기 때문에 자식 객체에서 메소드를 호출하면 재정의된

자식 메소드가 호출된다.

 

보통 메소드 재정의할 때는 @Override 어노테이션을 사용한다. 사용하는 이유는 메소드가 정확히 재정의된 것인지

컴파일러가 확인하기 때문에 개발자의 실수를 줄여주기 때문이다.

 

아래 예제를 살펴보자.

원의 면적을 구하는 기능인데 부모 클래스는 pi의 값이 부정확해서 자식클래스에서 정확한 pi값으로

재정의한다고 해보자.

부모클래스
자식 클래스에서 메소드재정의
부모 메소드와 자식 재정의메소드 사용
결과값 비교

 

 


광고타임


ㅇ부모 메소드 호출하기

자식 클래스에서 부모 클래스의 메소드를 재정의하게 되면 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용된다. 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super 키워드를 붙여서 부모 메소드를 호출할 수 있다.

super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.

super.부모메소드();

 

아래 예제는 부모 클래스의 메소드를 재정의한 자식 클래스의 메소드 사용과 기존 부모 클래스의 메소드를 사용하는 것을 보여준다.

자식 클래스에서 flyMode가 1이면 super.fly(); 로 정의하는 것을 알 수 있다.

부모 클래스
자식 클래스
자식 객체 사용
실행 결과

 

 

ㅁfinal 클래스와 final 메소드

final 키워드는 클래스, 필드, 메소드를 선언할 때 사용할 수 있는데 해당 선언이 최종 상태이고 더 이상 수정될 수 없음을 의미한다.

 

ㅇ상속할 수 없는 final 클래스

클래스 선언할 때 final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.

즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다는 것이다.

public final class String { ... }

 

ㅇ재정의할 수 없는 final 메소드

메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드가 된다.

 

즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서

재정의할 수 없다.

public final 리턴타입 메소드( [매개변수, ... ] ) { ... }

 


* 참고 protected 접근 제한자

protected 접근 제한자는 같은 패키지에서는 접근 제한이 없지만(=default와 같다)

다른 패키지에서는 자식 클래스만 접근을 허용한다.


 

 

[출처]

혼자공부하는자바-신용권

 

728x90
반응형

'데이터 엔지니어링 정복 > JAVA & JSP' 카테고리의 다른 글

[JAVA] 추상 클래스  (0) 2020.11.04
[JAVA] 타입변환과 다형성  (0) 2020.11.03
[JAVA] 패키지와 접근 제한자  (0) 2020.10.28
[JAVA] 인스턴스 멤버와 정적멤버  (0) 2020.10.27
[JAVA] 메소드  (0) 2020.10.26
Comments