Java 개념

다형성과 super

ron_nie 2023. 7. 2. 16:03
728x90

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은 공장카메라가 된다.

반응형