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

김희수님의 프로필 이미지
김희수

작성한 질문수

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

퀴즈 #8

8번퀴즈 speedCam 객체의 Setter가 궁금합니다

작성

·

196

1

안녕하세요 매번 강의 잘 듣고 있습니다.

8번 퀴즈를 풀면서 궁금한게 생겨 글써봅니다.

앞선 Interface 강의에서는 FactoryCam의 객체를 만들었을때

FactoryCam factoryCam = new FactoryCam();
factoryCam.setDetector(advancedFireDetector);
factoryCam.setReporter(videoReporter);
		
factoryCam.detect();
factoryCam.report();

setDetector()setReporter()의 인수로 위에서 정의한

Reportable videoReporter = new VideoReporter();
Detectable advancedFireDetector = new AdvancedFireDetector();

두 객체를 지정하셨는데 퀴즈 8번에서는 이렇게 인스턴스 객체를 만들고 인수에 집어넣는게 아닌

SpeedCam speedCam =  new SpeedCam();
speedCam.setDetector(new AccidentDetector());
speedCam.setReporter(new VideoReporter());

new AccidentDetector(), new VideoReporter() 인스턴스를

바로 인수로 집어넣는것이 import만 쓰면 가능하다는걸 보여주시려고 작성한건지 궁금해서 여쭤봅니다.

1회차로 강의를 보는중이라 기본적인 용어의 혼동이나 이전 강의들의 개념도 아직 제대로 정립되지않아 질문하기를 망설였지만 답변받으면서 얻는 정보도 있을거라 생각하여 질문드려봅니다.

 

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

앞에서 참조를 공부할 때 다음과 같은 코드가 있었습니다.

Camera c1 = new Camera();

이는 new 키워드를 통해 새로운 Camera 객체를 메모리 공간 어딘가에 만들고 나서 c1 이라고 하는 변수로 참조를 하는 것이죠.

 

그리고 이런 코드도 있었습니다.

Camera c2 = new Camera();
c2 = c1;

동일한 방법으로 new 키워드를 통해 새로운 Camera 객체를 메모리 공간 어딘가에 만들고 나서 c2 라고 하는 변수로 참조를 하는 건데, 두 번째 줄의 c2 = c1; 을 통해 c2 는 이번에 새롭게 만든 Camera 객체가 아닌, c1 변수가 참조하고 있는 Camera 객체를 참조하게 됩니다.

 

지하철에서 두 사람(c1, c2)이 서로 다른 손잡이를 잡고 있었는데, 한 사람(c2)이 잡고 있던 손잡이를 놓고 다른 사람(c1)이 잡고 있던 손잡이를 잡은 것과 비슷한 상황이에요. 2개의 손잡이 중 하나는 아무도 잡고 있지 않게 되고, 하나는 두 사람이 함께 잡고 있는 것이죠.

 

그래서 c1, c2 변수를 통해서 동일한 Camera 객체에 접근하여 이름(name 인스턴스 변수)을 바꾸는 등의 작업이 가능해진 것입니다.

 

언급해주신 것처럼 아래 2줄의 코드 또한 새로운 VideoReporter, AdvancedFireDetector 객체를 만들고 각각의 변수로 참조를 하는 것입니다.

Reportable videoReporter = new VideoReporter();
Detectable advancedFireDetector = new AdvancedFireDetector();

그리고 setter 를 통해서 참조 변수를 넘기면 setter 내에서는 이들이 참조하고 있는 객체에 접근을 할 수 있게 되겠지요.

 

이는 마치 승객들로 붐비는 지하철에서 한 사람이 손잡이를 잡고 있었는데 옆에 있는 사람에게 "넘어질 수 있으니 이 손잡이를 함께 잡아요" 라고 하는 것과 비슷합니다. VideoReporter 객체의 경우 videoReporter 변수, 또는 setter 내에서 this.detector 변수로 함께 참조가 가능해지는 것이죠.

FactoryCam factoryCam = new FactoryCam();
factoryCam.setDetector(advancedFireDetector);
factoryCam.setReporter(videoReporter);

하지만 VideoReporter, AdvancedFireDetector 객체를 만들고 나서 별다른 작업을 하지는 않습니다. 우리 예제에서는 객체를 만들기만 할 뿐 다음과 같이 세부적인 데이터를 정의하지는 않고 있어요.

Reportable videoReporter = new VideoReporter();
videoReporter.price = 100000; // 가격 설정 (예시)

Detectable advancedFireDetector = new AdvancedFireDetector();
advancedFireDetector.price = 200000; // 가격 설정 (예시)

메소드를 호출할 때 새로운 객체를 만들어서 전달하는데 객체에 어떤 작업을 하지 않는다면 굳이 videoReporter, advancedFireDetector 라는 이름의 참조 변수를 만들 필요 없이 바로 넘겨도 무방합니다.

 

퀴즈에서와 같이 말이죠.

SpeedCam speedCam =  new SpeedCam();
speedCam.setDetector(new AccidentDetector());
speedCam.setReporter(new VideoReporter());

지하철 손잡이로 설명한다면 아무도 잡고 있지 않던 손잡이를 setter 내에서 this.detector 라는 사람(인스턴스 변수)이 처음으로 잡게 되는 거라고 생각하시면 되겠습니다.

 

정리하면, 객체를 만들고 데이터 설정 등의 작업을 하고 나서 메소드에 전달할 필요가 있다면 FactoryCam 예제처럼 하시고, 그렇지 않은 경우에는 SpeedCam 예제처럼 하실 수 있습니다. 물론 SpeedCam 예제에서도 AccidentDetector, VideoReporter 객체를 별도로 생성하셔도 아무런 문제가 없습니다.

Reportable videoReporter = new VideoReporter();
Detectable accidentDetector = new AccidentDetector();

SpeedCam speedCam =  new SpeedCam();
speedCam.setDetector(accidentDetector);
speedCam.setReporter(videoReporter);

 

궁금증 해결에 도움되길 바라겠습니다 😊

감사합니다.

김희수님의 프로필 이미지
김희수
질문자

손잡이 예시로 상세히 설명해주셔서 감사합니다

그동안은 일단 참조 변수부터 생성하고 시작했었는데 그에 대해서도 좀 더 알게된거 같네요

답변 고맙습니다

김희수님의 프로필 이미지
김희수

작성한 질문수

질문하기