다형성
115
2 asked
다형성 강의 관련해서 질문드릴게있습니다.
instanceof를 쓸 때 형 변환이 왜 필요한지 알고싶습니다.
Answer 2
0
안녕하세요?
먼저 코드를 살펴 보면 camera, factoryCam, speedCam 은 각각 아래와 같이 정의되어 있습니다.
Camera camera = new Camera();
Camera factoryCam = new FactoryCam();
Camera speedCam = new SpeedCam();그리고 instanceof 를 사용하는 코드는 이렇게 되어 있지요.
if (camera instanceof Camera) {
System.out.println("카메라입니다.");
}
if (factoryCam instanceof FactoryCam) {
((FactoryCam) factoryCam).detectFire();
}
if (speedCam instanceof SpeedCam) {
((SpeedCam) speedCam).checkSpeed();
((SpeedCam) speedCam).recognizeLicensePlate();
}이 곳에서 FactoryCam, SpeedCam 등으로 형 변환을 해야 하는 이유에 대해서 궁금하신 것 같습니다.
앞서 선언한 camera, factoryCam, speedCam 는 모두 Camera 타입이므로 Camera 클래스 내에 있는 메소드(takePicture 등)는 호출 가능하지만 FactoryCam 이나 SpeedCam 에 있는 메소드는 직접적으로 호출이 불가능해요. Camera 클래스 내에서는 checkSpeed(), detectFire() 와 같은 메소드가 정의되지 않았거든요.
하지만 상속 관계에 있는 경우에는 자식 클래스로 형 변환을 하면 자식 클래스에 정의된 메소드 호출이 가능해진답니다. 마치 다음 코드처럼 Camera 가 아닌 FactoryCam, SpeedCam 으로 선언했듯이 말이죠.
Camera camera = new Camera();
FactoryCam factoryCam = new FactoryCam();
SpeedCam speedCam = new SpeedCam();위 코드에 의하면 factoryCam 객체는 FactoryCam 클래스의 모든 메소드와 부모 클래스인 Camera 의 메소드에 접근이 가능합니다. speedCam 또한 SpeedCam 클래스의 모든 메소드와 부모 클래스인 Camera 의 메소드에 접근이 가능해지는 것이죠.
따라서 앞의 예제에서도 FactoryCam 이나 SpeedCam 에 있는 메소드를 호출하기 위해서는 형 변환이 필요하답니다.
궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 류경완님께서 질문 주신 다형성 및 instanceof 사용에 대한 내용을 설명드리겠습니다.
다형성은 객체 지향 프로그래밍에서 여러 클래스들이 동일한 인터페이스로 묶일 수 있지만, 각각이 자체적인 기능을 가지고 실행될 수 있도록 하는 중요한 개념입니다. 이는 코드의 유연성과 재사용성을 높여주죠.
instanceof 연산자는 객체가 특정 클래스 또는 그 클래스의 하위 클래스의 인스턴스인지를 확인하는 데 사용됩니다. 이를 통해 객체의 실제 타입을 확인하고 해당 타입에 맞게 특정 메소드를 안전하게 호출할 수 있습니다.
왜 형 변환이 필요한가요?
다형성을 통해, 예를 들면 부모 타입의 참조변수로 자식 객체를 참조할 수 있습니다.
Camera cam = new FactoryCam();
이때 참조 변수가 부모 타입이기 때문에, 기본적으로 부모 클래스에 정의된 메소드만 호출할 수 있습니다. 자식 클래스에만 있는 메소드에 접근하기 위해서는 형 변환이 필요합니다.
형 변환과 instanceof의 조합
형 변환을 하려면 변환할 객체가 해당 클래스의 인스턴스인지 확인해야 안전합니다. 그렇지 않으면 런타임 에러가 발생할 수 있습니다. 그래서 instanceof를 사용해 객체의 실제 타입을 확인한 다음, 형 변환을 실행합니다.
if (cam instanceof FactoryCam) {
// 안전하게 FactoryCam 타입으로 형 변환 후 메소드 호출
((FactoryCam)cam).detectFire();
}
이 코드에서는 cam이 실제로 FactoryCam의 인스턴스인지 확인한 뒤에, 그 클래스에만 정의된 detectFire() 메소드를 호출할 수 있습니다.
참고 자료
이와 같은 궁금증에 대해 다른 학생분들과 지식공유자님께서 상세히 논의한 게시물이 있습니다:
- instanceof의 의미
- 객체부분에서 다형성의 의미를 알고싶습니다
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?
0
132
2
static이 뭐였는지 기억이 안나요 ㅜㅜ
0
110
2
Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의
0
69
1
사고력 키우는 법이 어떤게 있나요?
0
87
2
getter setter
0
100
2
섹션9. 66 메소드 오버로딩 시 질문이 있습니다.
0
77
1
안녕하세요 갑자기 프로그램 에러가 떠서 안되네요
0
75
2
변수 이름짓는법
0
114
2
intelli J 실행오류
0
114
2
혹시 이건 수학적 사고가 부족한 걸까요?
0
152
2
영상이 재생이 안됩니다.
0
163
3
이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.
0
114
2
응용이 어렵습니다.
0
203
2
IntelliJ가 보이지 않습니다.
0
182
3
JDK 버전 문의
0
128
2
BlackBox 파일 내에서 메소드 정의
0
135
1
동기화
0
120
2
Iterator 문의
0
101
1
코드 순서 문의
0
139
1
클래스 메소드
0
146
2
Quiz_05 관련 질문드립니다 !
0
114
2
다운로드가 안됩니다
0
162
2
HashMap
0
75
2
재생이 안됩니다ㅠㅠ
0
117
2

