TIL

상속 정복하기

류정근 2024. 4. 27. 16:24
상속!! 이해라도 해보자

 

개인과제로 계산기를 만들다 상속 관계를 만드는 곳에서 완전 막혀버렸다. 활용 할 수 없다는 것은 아직 손에 익숙하지 않기 때문일 수도 있지만, 내가 생각하기에는 이해가 부족하다!!

 

주말시간을 활용해 한번 이해해 보자.

 

상속이 필요한 이유

 

전기차와 가솔린차는 자동차(Car) 의 구체적인 개념이다. 반대로 자동차(Car)는 전기차와 가솔린차를 포함하는 추상적인 개념이다 . 그래서인지 잘 보면 둘의 공통 기능이 보인다. 바로 이동( `move()` )이다.
전기차든 가솔린차든 주유하는 방식이 다른 것이지 이동하는 것은 똑같다. 이런 경우 상속 관계를 사용하는 것이 효과적
이다.

 

상속관계

상속은 객체 지향 프로그래밍의 핵심 요소 중 하나이다. 기존 클래스의 필드와 매서드를 새로운 클래스에서 재사용하게 해준다. 기존 클래스의 속성과 기능을 그대로 물려받는다. 상속을 사용하려면 `extends` 키워드를 사용하면 된다. 그리고 `extends` 대상은 하나만 선택할 수 있다.

 

용어 정리

부모 클래스(슈퍼 클래스) :상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스

자식 클래스(서브클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스

 

 

전기차와 가솔린차가 `Car` 를 상속 받은 덕분에 `electricCar.move()` , `gasCar.move()` 를 사용할 수 있다.

 

사용 방법

public class ElectricCar extends Car {
public void charge() {
System.out.println("충전합니다.");
}
}
```
public class CarMain {
public static void main(String[] args) {
ElectricCar electricCar = new ElectricCar();
electricCar.move();
electricCar.charge();
GasCar gasCar = new GasCar();
gasCar.move();
gasCar.fillUp();
}
}

 

※ 상속은 부모의 기능을 자식이 물려받는 것이다. 자식(전기자동차,가솔린자동차)이 부모의 기능을 물려받아서 사용하는 것은 가능하지만 부모클래스는 자식클래스에 접근할 수 없다. 

 

단일 상속

자바는 다중 상속을 지원하지 않는다. 그래서 extend 대상은 하나만 선택할 수 있다. -> 부모클래스를 하나만 선택가능, 부모클래스가 또 다른 부모를 가지는 것은 당연히 가능(인터페이스는 다중 구현을 허용한다).

 

상속과 메모리 구조

new ElectricCar() 를 호출하면 상속관계에 있는 Car에도 인스턴스를 생성한다. 

실험을 해본 결과 Car에 생성된 메모리 주소와 ElectricCar에 생성된 메모리 주소는 동일했다.

외부에서 볼때는 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식이 모두 생성되고 공간
도 구분된다.

 

electricCar.charge()를 호출하면 참조값을 확인하여 ElectricCar에서 charge() 메서드를 호출한다.

여기서 중요한점!!

컴퓨터는 charge메서드를 호출 할 때 Car 클래스에서 찾을지 ElectricCar 클래스에서 찾을 지 선택을 해야한다.

이때는 호출하는 변수의 타입(클래스)을 기준으로 선택한다!!

 

 

ElectricCar 타입(클래스) 으로 호출했기 때문에 본인 타입에서 먼저 찾고 없으면 부모타입에서 찾음!!

만약 부모타입에서도 없으면 더 상위 부모에 올라가 찾는다. (어떤 부모클래스에도 존재하지 않으면 컴파일 오류)

 

상속의 장점

상속 관계를 통해 새로운 자식클래스를 편리하게 확장(extend) 할 수 있다.

그리고 모든 자동차에 새로운기능(openDoor)을 추가하고 싶을 때는 부모 클래스에만 추가하면 된다(중복을 제거).

 

 

 

핵심정리

1.상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다.

2.상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다.

3.현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 기능을 찾지 못하면 컴파일 오류
가 발생한다.

 

추가

 

클래스와 매서드에 사용되는 final

클래스에 final을 사용하는 경우

상속불가!!

final로 선언된 클래스는 확장(extend) 불가!. 다른 클래스가 final로 선언된 클래스를 상속받을 수 없음!!

예: `public final class MyFinalClass {...}`

 

메서드에 final을 사용하는 경우

오버라이딩 불가!!

final` 로 선언된 메서드는 오버라이드 될 수 없다. 상속받은 서브 클래스에서 이 메서드를 변경할 수 없다.

예: `public final void myFinalMethod() {...}`

 

출처 : 김영한의 실전 자바 - 기본편

'TIL' 카테고리의 다른 글

인터페이스  (0) 2024.04.29
추상클래스  (0) 2024.04.27
계산기 만들기  (3) 2024.04.26
TIL(4)  (4) 2024.04.24
Til(3)  (4) 2024.04.23