inflearn logo
강의

Course

Instructor

Java Basics by Nadokoding - Full Course (20 hours)

Polymorphism

다형성

115

rkw21150349

2 asked

0

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

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

java 객체지향

Answer 2

0

nadocoding

안녕하세요?

먼저 코드를 살펴 보면 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

communityai8509

안녕하세요, 인프런 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