강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

류경완님의 프로필 이미지
류경완

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

다형성

다형성

작성

·

95

0

 다형성 강의 관련해서 질문드릴게있습니다.

instanceof를 쓸 때 형 변환이 왜 필요한지 알고싶습니다.

답변 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의 의미
- 객체부분에서 다형성의 의미를 알고싶습니다

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

류경완님의 프로필 이미지
류경완

작성한 질문수

질문하기