inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

다형성

강사님, 아무래도 제 개념의 혼동 때문에 그러는 것 같은데요..!

439

흰머리오목눈이

작성한 질문수 18

0

 

if (factoryCam instanceof FactoryCam) {
   (FactoryCam)factoryCam;
}

이 구문에 혼동이 생겨서 질문드립니다! if 안에 조건문의 내용이 " factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 " 이라고 설명을 해주셨는데요 (8분 27초경)

 

만약에 factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 형변환이 필요 없는거 아닌가요?

 

또 헷갈린거 하나 더 문의드립니다. 다형성에 대한 예시를 위해 작성해주셨던 코드 내용인데요.

Camera factorycCam = new FactoryCam();

만약에 위 코드로 작성한게 부모클래스인 " Camera" 로 객체를 생성한 거라면, factoryCam 의 참조 클래스는 Camera 인 것 같은데요. (그러니까 FatoryCam 의 인스턴스 메서드를 불러왔을 때 에러가 나는 것으로 보이구요.)

 

근데 이 설명과 "factoryCam instanceof FactoryCam" 이 구문이 " factoryCam 이 FactoryCam 클래스의 인스턴스가 맞다면 " 이라고 설명을 해주시니 상충되는 내용이 아닌가 싶어 혼동이 옵니다.

 

내용 요약

  1. factoryCam 은 부모 클래스로 만들어진 객체라서 FactoryCam 의 인스턴스 메서드를 사용할 수가 없다고 설명을 해주셨습니다!

  2. 헌데 if 조건문은 "factoryCam 이 FactoryCam 클래스에 포함되어 있다면 " 이라고 설명해주신 부분이 상충되지 않나 하여 헷갈립니다.

  3. 그리고 2번에 내용처럼 만약 factoryCam 이 FactoryCam 클래스에 이미 포함되어 있다면, 굳이 형변환을 하지 않고도 detectFire 메서드를 호출할 수 있어야 하지 않는지..?

제가 개념을 잘못 이해하고 있을 것 같은데, 혹시 설명을 좀 부탁드려도 될까요?

이 부분에 자꾸 혼동이 생겨서 다음으로 넘어가기가 어렵네요 🤣

ps. 이전에 강사님 파이썬 강의로 난생 처음 태어나 클래스란 개념을 이해했던 수강생으로써, 이번 자바편도 개인적으로 큰 도움되고 있습니다. 감사합니다!

객체지향 oop java

답변 2

1

나도코딩

안녕하세요?
답변을 드리기 전에 참조 변수의 이름을 factoryCam 이 아닌 cam 으로 바꿔서 설명을 드리겠습니다. 그래야 조금 덜 헷갈릴 것 같아요 🤩
즉 아래와 같이 코드를 작성했다고 생각해주세요.

Camera cam = new FactoryCam();

다형성에 의해 cam 은 Camera 클래스를 상속하는 FactoryCam 클래스 인스턴스를 참조할 수 있지만

FactoryCam cam = new FactoryCam();

이 아닌

Camera cam = new FactoryCam();

과 같이 만들었기 때문에 cam 은 우선은 Camera 클래스가 가지는 변수나 메소드만 사용할 수 있어요. 위 코드에서 등호(=) 이전까지만 있다고 생각해볼게요.

Camera cam;

cam 참조 변수는 어떤 클래스의 인스턴스를 참조할지 아직은 모릅니다. Camera 가 될 수도 있고 FactoryCam 이 될 수도 있고 SpeedCam 이 될 수도 있죠. 이런 상황에서 FactoryCam 클래스에만 정의되어 있는 메소드인 cam.detectFire() 를 사용한다는 건 문제의 되지요. 하지만 Camera 클래스에 정의된 takePicture() 나 recordVide() 메소드를 호출하는 데에는 아무런 문제가 없습니다.

단, 강의 예제에서는 FactoryCam 클래스의 defectFire() 라는 메소드를 호출하려고 하고 있으며, 이를 위해서는 factoryCam 을 FactoryCam 으로 형변환 해줘야만 사용이 가능해집니다. Camera 에는 detectFire() 메소드가 없기 때문이죠! 그리고 이 과정에서 과연 정말 cam 의 참조 대상이 FactoryCam 인지를 확인하기 위해 아래 코드를 적은 것입니다.

if (cam instanceof FactoryCam) {
    ...
}

만약 cam 이 FactoryCam 이 아닌 SpeedCam 클래스 인스턴스를 참조하고 있었다면, 즉 cam instanceof FactoryCam 문장의 결과가 false 라면 cam 을 FactoryCam 으로 형변환 하면 안되니까요 😲

상속과 다형성은 처음에는 누구나 헷갈리는 부분입니다. 다소 어려운 개념이지만 잘 익혀두시면 나중에 큰 프로젝트를 진행하실 때에도 정말 아름다운 구조를 가지는 클래스들을 만드실 수 있을거에요. 제가 드린 답변이 여전히 이해가 되지 않으신다면 다시 질문 남겨주세요 😉
감사합니다.

0

흰머리오목눈이

바쁘실텐데 시간내 답변 작성해주셔서 감사합니다. 사실 정확히 이해는 잘 안되긴 합니다ㅠ 아마 제가 기본기가 많이 부족하다 보니 그런 것 같습니다.

정확한 용도를 알고 싶은데, 다음번에 다시 한 번 질문글 드리도록 하겠습니다. 여러번 읽어볼게요! 감사합니다!

0

cksdyd1111

if (factorycam instanceof Factorycam) {

위에조건문은 factorycam 변수가 Factorycam 클래스 인스턴스변수인지 확인을 하는 조건문입니다 그렇다면 조건문안에 왜 형 변환을 해야하냐 .. factorycam 클래스인스턴스 변수가 부모클래스인 Camera 클래스로 생성이 되어있기 때문입니다. 그냥 조건문안에 factorycam.detectfire(); 이렇게만 넣어도되는데 비유를 하자면 출국심사에서 소지품검사를 스캔으로 확인했는데 느닷없이 내껏인지까지 확인을하냐? 비유가 적절한지 모르겠지만 이미 factorycam은 부모라는 Camera클래스로 인스턴스변수를 정의했기때문인것같네요

 

 

3차원 배열의 인덱스 해석 순서와 3중 반복문 순회 메커니즘에 대해 질문드립니다.

0

14

1

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

176

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

139

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

91

1

사고력 키우는 법이 어떤게 있나요?

0

114

2

getter setter

0

117

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

92

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

92

2

변수 이름짓는법

0

125

2

intelli J 실행오류

0

127

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

169

2

영상이 재생이 안됩니다.

0

177

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

124

2

응용이 어렵습니다.

0

219

2

IntelliJ가 보이지 않습니다.

0

203

3

JDK 버전 문의

0

135

2

BlackBox 파일 내에서 메소드 정의

0

141

1

동기화

0

131

2

Iterator 문의

0

109

1

코드 순서 문의

0

147

1

클래스 메소드

0

157

2

Quiz_05 관련 질문드립니다 !

0

126

2

다운로드가 안됩니다

0

171

2

다형성

0

126

2