[Java]상속에 대해

박중연·2024년 3월 24일

7. 상속

7.1 상속 개념

  • 현실에서의 상속: 부모가 자식에게 물려주는 행위
  • 객체지향에서의 상속: 부모 클래스의 멤버를 자식 클래에스에 물려주기.

상속은 이미 잘 개발된 클래스를 활용하기에, 코드의 중복을 줄여준다.
단, 상속을 해도 부모 클래스의 모든 필드와 메소드를 물려받는 것은 아니다.
부모 클래스에서 private 접근 제한을 갖는 필드/메소드는 상속 대상에서 제외 된다.

상속을 이용하면 클래스의 수정을 최소화 시킬 수 있다.
부모 클래스의 수정으로 모든 자식 클래스들의 수정 효과를 가져오기 때문에 유지 보수 시간을 줄인다.
(이 말은 잘못 설계한 부모 클래스의 수정은 모든 클래스의 수정을 의미한다.)

7.2 클래스 상속

프로그램에서는 자식이 부모를 선택한다.
자식 클래스를 선언할 때 어떤 부모 클래스를 상속 받을 것인지 결정한다.

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

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

7.3 부모 생성자 호출

자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성된다.
아래 코드는 DmbCellPhone 객체만 생성하는 것 처럼 보이지만, 내부적으론 부모인 CellPhone객체가 먼저 생성되고, DmbCellPhone 객체가 생성된다

DmbCellPhone dmbCellPhone = new DmbCellPhone();

모든 객체는 클래스의 생성자를 호출해야만 생성된다.
부모 객체도 예외는 아니다. 그렇다면 부모 생성자를 어디서 호출한 것일까?
DmbCellPhone 생성자가 명시적으로 선언되지 않았다면, 컴파일러는 다음과 같은 기본 생성자를 생성해 낸다.

public DmbCellPhone(){
	super(); //부모 생성자 호출
    //super(매갯값 ...) -> 일치하는 부모 생성자 호출, 없을 시 컴파일 오류
}

super()는 부모의 기본 생성자를 호출한다.
부모클래스에 기본 생성자가 없고, 매개 변수가 있는 생성자만 있다면 반드시 자식 생성자에서 부모 생성자 호출을 위해 super(매갯값, ...)를 명시적으로 호출해야 한다.
super는 자식 생성자 첫 줄에 위치해야 한다.

7.4 메소드 재정의

부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면, 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다.
이 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야 한다.
이런 경우를 위해 메소드 오버라이딩 기능을 제공한다.

7.4.1 메소드 재정의(@Override)

메소드 오버라이딩은 자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다.
메소드가 오버라이딩 되었다면, 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면, 오버라이딩된 자식 메소드가 호출된다.

메소드 오버라이딩 규칙

  • 부모 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)
  • 접근 제한을 더 강하게 오버라이딩할 수 없다.
  • 새로운 예외(Exception)을 throws할 수 없다.

7.4.2 부모 메소드 호출(super)

자식 클래스에서 부모 클래스의 메소드를 오버라이딩하게 되면, 부모 클래스의 메소드는 숨겨지고 오버라이딩 된 자식 메소드만 사용된다.
그러나 다음과 같이 부모 클래스의 메소드를 호출 할 수 있다.

super.부모메소드(); //super는 부모 객체를 참조

출처

해당 내용은 이것이자바다 교재 내용과

해당블로그 https://velog.io/@petit-prince/%EC%9D%B4%EA%B2%83%EC%9D%B4-%EC%9E%90%EB%B0%94%EB%8B%A4-7-%EC%83%81%EC%86%8D 를 참고함

profile
개발자로 취업하기

0개의 댓글