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

흰머리오목눈이님의 프로필 이미지
흰머리오목눈이

작성한 질문수

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

다형성

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

작성

·

363

·

수정됨

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

답변 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

if (factorycam instanceof Factorycam) {

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

 

 

흰머리오목눈이님의 프로필 이미지
흰머리오목눈이

작성한 질문수

질문하기