상속: 부모클래스에서 제공되는 것을 자식 클래스에서 상속받아 사용하는 것이다.
상속은 하나의 부모 클래스로부터만 상속 받을 수 있는 제약이 있다.
상속은 자식 클래스 정의 뒤에 extends 부모클래스 명을 붙여 정의할 수 있다.
해당 내용을 학습하기 위해 하위패키지를 생성해보자.
참고로 인텔리제이 상단 [Code]-[Generate]-[Constructor]를 선택하거나
인텔리제이 화면내에서 Alt+Insert 동시에 누른 후 [Constructor]를 선택하면 자동으로 생성자를 만들 수 있다.
우선 실습중인 chap_07 패키지 안에 새로운 camera 패키지를 생성하였다.
camera 패키지 내에 아래와 같이 Camera, FactoryCam, SpeedCam 클래스를 생성하였다.
- 일반 카메라, 속도 감지 카메라, 화재 감지 카메라
위와 같이 Camera, FactoryCam, SpeedCam을 생성하였는데
각 카메라 데이터 관리를 위하여 사진을 촬영하거나 동영상을 녹화할때 로그를 남기기로 했다고 생각해보자.
위 예제를 위해 chap_07 패키지 내 _12_InHeritance 클래스에서 객체를 만들어보자.
현재는 takePicture(), recordVideo() 메소드 실행 시 아무런 동작도 실행하지 않도록 설정해두었다.
그런데 Camera, FactoryCam, SpeedCam 클래스 내 아래 메소드가 실행될 때
.takePicture() 메소드 호출 시 "사진을 촬영합니다."
.recordVideo() 메소드 호출 시 "동영상을 녹화합니다."
라고 출력되도록 수정한다고 생각해보자.
위 작업을 위해서는 각각의 클래스 Camera, FactoryCam, SpeedCam 내의
.takePicture() 메소드와 .recordVideo() 메소드를 각각 수정해야하는 번거로움이 있다.
이는 작업이 번거로울 뿐 아니라 실수가 유발될 수 있는 부분이기도 하다.
이러한 문제를 개선하기 위하여 상속의 개념을 사용해보자.
.takePicture() 메소드와 .recordVideo() 메소드는 Camera, FactoryCam, SpeedCam메소드에 모두 필요한 점을 이용하는 것이다.
우선 상속을 위하여 Camera 클래스를 부모클래스로 설정하도록 하자.
- 부모클래스 : 기능을 물려주는 클래스
- 자식클래스 : 기능을 물려받는 클래스
참고로 자식클래스 선언 방법은 클래스 정의 부분 뒤에 "extends 부모클래스명" 을 붙여주는 것이다.
public class FactoryCam extends Camera
먼저 부모클래스인 Camera 클래스를 아래와 같이 수정하였다.
takePicture() 메소드 실행 시 "사진을 촬영합니다" 출력
recordVideo() 메소드 실행 시 "동영상을 녹화합니다" 출력
이번에는 자식 클래스인 FactoryCam, SpeedCam을 수정해보자
Point 1) 자식클래스는 클래스 정의 뒤에 extends 부모클래스의 이름을 정의한다.
Point 2) 자식클래스는 부모로부터 기능을 상속받을 수 있으므로 Camera 클래스와 중복된 코드를 삭제한다.
위와 같이 자식 클래스 내의 중복된 코드를 없애고 부모클래스를 설정하였다.
앞서 생성한 chap_07 패키지 내 _12_InHeritance 클래스에서 다음과 같이 실행해보자.
FactoryCam과 SpeedCam 클래스 내에 takePicture(), recordVideo() 메소드가 없음에도 위와 같이 잘 출력되는 것을 볼 수 있다.
이는 부모클래스인 Camera 클래스의 메소드를 물려받아 실행한 것이다.
FactoryCam.detectFire()나 SpeedCam.checkSpeed() 같이 자식클래스만이 가지고 있는 메소드도 정상적으로 실행되는 것을 확인할 수 있다.
'Spec UP - Backend > 나도코딩의 자바기본편' 카테고리의 다른 글
Chap_07. 다형성 (0) | 2023.04.28 |
---|---|
Chap_07. 메소드 오버라이딩 (0) | 2023.04.28 |
Chap_07. 패키지 (0) | 2023.04.28 |
Chap_07. 접근 제어자 (0) | 2023.04.27 |
Chap_07. Getter & Setter (0) | 2023.04.26 |
댓글