티스토리 뷰
1. 상속의 정의 및 사용 이유
1-1. 상속(Inheritance)이란?
💡 부모 클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려 받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술.(단, 생성자는 물려 받지 않음)
멤버 외에도 부모 클래스의 타입 또한 상속이 된다.(다형성의 토대)
자바는 단일상속(자식 클래스는 하나의 부모 클래스만 가지는)만 지원.
package com.ohgiraffers.section01.extend;
public class Application {
public static void main(String[] args) {
/* 수업목표. 상속에 대해 이해할 수 있다. */
// 다형성을 적용하기 위한 문법적 토대가 상속이다!
Car car = new Car();
car.soundHorn();
car.run();
car.soundHorn();
car.stop();
car.soundHorn();
System.out.println();
FireCar fireCar = new FireCar();
fireCar.soundHorn();
fireCar.run();
fireCar.soundHorn();
fireCar.stop();
fireCar.soundHorn();
fireCar.sprayWater();
System.out.println();
RacingCar racingCar = new RacingCar();
racingCar.soundHorn();
racingCar.run();
racingCar.soundHorn();
racingCar.stop();
racingCar.soundHorn();
}
}
// 실행 결과
Car 클래스의 기본 생성자 호출됨...
주행중이 아닐 때는 경적을 울릴 수 없습니다.
자동차가 달리기 시작합니다.
빵! 빵!
자동차가 멈춥니다.
주행중이 아닐 때는 경적을 울릴 수 없습니다.
Car 클래스의 기본 생성자 호출됨...
FireCar 클래스의 기본 생성자 호출됨...
빠아아아아아아앙!!~ 빠아아아아아아앙!!
자동차가 달리기 시작합니다.
빠아아아아아아앙!!~ 빠아아아아아아앙!!
자동차가 멈춥니다.
빠아아아아아아앙!!~ 빠아아아아아아앙!!
불난 곳을 발견했습니다. 물을 뿌립니다. ===========3
Car 클래스의 기본 생성자 호출됨...
레이싱카는 경적따위 울리지 않습니다.
레이싱 자동차가 신나게 달립니다. 쌔애애앵!~
레이싱카는 경적따위 울리지 않습니다.
자동차가 멈춥니다.
레이싱카는 경적따위 울리지 않습니다.
package com.ohgiraffers.section01.extend;
public class Car { // 자동차라면 필요한 기능들..
private boolean runningStatus;
public Car() {
super(); // 모든 클래스는 부모를 가지고 있다. Object 클래스!
System.out.println("Car 클래스의 기본 생성자 호출됨...");
}
public void run() {
runningStatus = true;
System.out.println("자동차가 달리기 시작합니다.");
}
public void soundHorn() {
if(runningStatus) {
System.out.println("빵! 빵!");
} else {
System.out.println("주행중이 아닐 때는 경적을 울릴 수 없습니다.");
}
}
public boolean isRunning() {
return runningStatus;
}
public void stop() {
runningStatus = false;
System.out.println("자동차가 멈춥니다.");
}
}
package com.ohgiraffers.section01.extend;
public class FireCar extends Car { // 자바는 단일 상속만 지원!
public FireCar() {
/* 설명. 부모로부터 생성자는 물려받지 않고 super()를 통해 부모 객체 먼저 생성 */
super(); // 안적어도 자동으로 생성 되는 구문
System.out.println("FireCar 클래스의 기본 생성자 호출됨...");
}
/* 설명. 부모로부터 물려받는 필드 및 메소드 외에 기능 하나 더 추가(확장) */
public void sprayWater() {
System.out.println("불난 곳을 발견했습니다. 물을 뿌립니다. ===========3");
}
@Override // @ : Annotation
/* 필기.
* @Override 어노테이션을 추가하는 이유?
* 1. 메소드 중에 부모로부터 물려받은 메소드인 것을 한 눈에 알아보기 쉽게 하기 위해서(가독성 추천)
* 2. 부모의 메소드를 오버라이딩할 때 발생할 수 있는 실수를 방지하기 위해서(실수방지 측면)
* */
public void soundHorn() {
System.out.println("빠아아아아아아앙!!~ 빠아아아아아아앙!!");
}
}
package com.ohgiraffers.section01.extend;
public class RacingCar extends Car {
// 생성자 안적으면
// public RacingCar() {
// super();
// }
// 위의 부분 적혀있는거다!
@Override
public void run() {
System.out.println("레이싱 자동차가 신나게 달립니다. 쌔애애앵!~");
}
@Override
public void soundHorn() {
System.out.println("레이싱카는 경적따위 울리지 않습니다.");
}
}
1-2. 상속을 사용하는 이유
- 기존에 작성된 클래스의 멤버를 재사용할 수 있다.
- 클래스 간 계층 관계를 형성하여 다형성 문법의 토대가 된다. → 아직 상속 쓰는 이유
→ 잘 사용하면 유지보수에 도움 but 무분별하게 사용하면 되려 계층 구조 파악 및 정상 동작을 예측하기 힘들어 유지보수에 어려움 초래
'한화시스템 > 백엔드' 카테고리의 다른 글
[BE] JAVA_상속_오버라이딩 (0) | 2024.07.17 |
---|---|
[BE] JAVA_상속_superkeyword (0) | 2024.07.17 |
[BE] JAVA_클래스와 객체_uses 예제 (0) | 2024.07.16 |
[BE] JAVA_클래스와 객체_객체 배열 (0) | 2024.07.16 |
[BE] JAVA_클래스와 객체_초기화 블럭 (0) | 2024.07.16 |