오늘은 챕터15의 마지막 시간 instanceof 연산자에 대해서 알아보겠다.
instanceof 는 써본적이 없는 연산자인데,
참조변수가 참조하는 인스턴스의 '클래스'나 참조하는 인스턴스가 '상속하는 클래스'를 묻는 연산자이다.
if (참조변수 instanceof 클래스의 이름)
if (ca instanceof Cake)
이렇게 사용할 수 있다.
ca가 Cake의 인스턴스이거나 상속하는 클래스의 인스턴스면 true, 아니면 false이다.
이에 관련한 메소드 오버라이딩 문제가 있다.
instanceof 코드를 주고 instanceof 를 사용하지 않고 클래스의 상속 관계를 유지하며,
메소드 오버라이딩 기반으로 예제가 동작하도록 만들라고 한다.
그리고 필요하다면 메소드의 이름을 수정하라고 한다.
그 예제 코드는
class Box {
public void simpleWrap() {
System.out.println("Simple Wrapping");
}
}
class PaperBox extends Box {
public void paperWrap() {
System.out.println("Paper Wrapping");
}
}
class GoldPaperBox extends PaperBox {
public void goldWrap() {
System.out.println("Gold Wrapping");
}
}
public class Wrapping {
public static void main(String[] args) {
Box box1 = new Box();
PaperBox box2 = new PaperBox();
GoldPaperBox box3 = new GoldPaperBox();
wrapBox(box1);
wrapBox(box2);
wrapBox(box3);
}
public static void wrapBox(Box box) {
if (box instanceof GoldPaperBox) {
((GoldPaperBox) box).goldWrap();
} else if (box instanceof PaperBox) {
((PaperBox) box).paperWrap();
} else {
box.simpleWrap();
}
}
}
이렇다.
아이.. 문제를 이렇게 내면 어떡해..
instanceof 연산자를 사용하지 말래서 난 if안에 있는 이것을 어떻게 대체할까 생각을해봤는데,
아무래도 어떤 일말의 힌트도 주지 않은게 이상해서 답안을 보니..
그냥 wrapBox를 box.wrap(); 으로 쳐놓고,
위의 박스 클래스들의 출력 메소드 명을 wrap으로 바꿔놨다.
아이 이렇게 문제 설명을 해놓으면 안되지 참..
어쨋든 소스코드는
github: https://github.com/jeong-jaehyeon/JavaProject/blob/javaExercise/src/Wrapping.java
음 아 근데 맞는말이긴하지..
내가 너무 높이봤나..?
어쨋든 이렇게 해서 15챕터가 끝나고
다음은 16챕터를 진행한다. 상속의 마지막 챕터이다.
오늘의 코멘트: 어제 어떻게 그렇게 자버렸지.. 중간에 한번 깰법도한데..