1. 다형성(IS-A)
2023.07.02 - [Java 개념] - 상속과 메소드 오버라이딩
상속과 메소드 오버라이딩
1. 상속? 카메라 패키지 안에 클래스를 세개 만들었다. Camera camera = new Camera(); FactoryCam factoryCam = new FactoryCam(); SpeedCam speedCam = new SpeedCam(); 1-1. 왜 상속이 중요한가. 귀찮음을 사라지게 해주는게 가
codebene.tistory.com
여기서 보면 캠이라는 범주 안에 스피드캠과 공장캠이 있다. 이것을 영어로 하면
Speendcam is a Camera
Factorycam is a Camera
이렇게 변환 되는데 자식과 부모관계(상속관계)라고 해서 IS-A관계라고한다.
1-1. 활용
이게 왜 필요하냐면 같은 부모에 있는 자식들은 클래스를 불러올때 부모 클래스로 통일해줘도 괜찮기 때문이다.
Camera camera = new Camera();
FactoryCam factoryCam = new FactoryCam();
SpeedCam speedCam = new SpeedCam();
// 이렇게 IS-A 관계에 있는 상속이라면
Camera camera = new Camera();
Camera factoryCam = new FactoryCam();
Camera speedCam = new SpeedCam();
1-2. 이점
물론 이점도 분명 존재한다. 이렇게 클래스 이름을 하나로 통일하면 메소드를 배열로 만들어서 반복문을 사용할 수 있다.
Camera[] camera = new Camera[3];
camera[0] = new Camera();
cameras[1] = new FactoryCam();
cameras[2] = new SpeedCam();
// 반복문
for(Camera cam : cameras){
cam.showMainFeature
}
foreach를 사용하여 이전 글에서 하나씩 출력해야 하는 것을 한번에 출력할 수 있다.
1-3.만약에 자식 클래스를 호출해야 한다면?
부모클래스로 정렬이 되어있어서
factoryCam.detectFire();
speedCam.checkSpeed();
speedCam.recognizeLicensePlate();
이렇게 호출할 수는 없다!
형번환을 시켜줘야함!
if (camera instanceof Camera) {
System.out.println("카메라 입니다.");
}
if (factoryCam instanceof FactoryCam) {
((FactoryCam) factoryCam).detectFire();
}
if (speedCam instanceof SpeedCam) {
((SpeedCam) speedCam).checkSpeed();
}
if는 보통 이렇게 호출할때 잘 쓰는 조건문이고 안에 코드가 중요하다!! Camera factoryCam으로 되어있던 것을 FactoryCam factory캠 형식으로 형변환 시켜준 것!
1-4. Object
자바는 Object클래스를 항상 호출하고 있기 때문에 가장 큰 조상인 Object에게 상속시킬 수도 있다.
Object [] objs = new Object[3];
objs[0] = new Camera();
objs[1] = new FactoryCam();
objs[2] = new SpeedCam();
2. super
2-1. super?
부모클래스의 어떤 것을 자식 클래스가 사용하는 것이다. 만약 동영상을 녹화한 후에 화재감지를 하고싶다면
public void recordVideo(){
// 동영상 녹화
super.recordVideo();
detectFire();
}
메소드를 오버라이딩 시키는 것이 아닌(만약 오버라이딩 시킨다면 부모에서 코드를 수정할때 자식에서도 바꿔줘야한다) super을 이용해서 메소드를 호출해주면 된다.
2-2. 활용
// Camera
public Camera() {
this("카메라");
}
protected Camera(String name) {
this.name = name;
}
이런식으로 부모클래스에서 메소드를 만들어주고
// FactoryCam
public FactoryCam() {
super("공장 카메라");
}
이렇게 super로 받아주면 this.name은 공장카메라가 된다.
'Java 개념' 카테고리의 다른 글
final, Enum(열거형) (0) | 2023.07.03 |
---|---|
참조 (0) | 2023.07.03 |
상속과 메소드 오버라이딩 (0) | 2023.07.02 |
패키지 (0) | 2023.07.02 |
접근제어자 (0) | 2023.07.02 |