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

최원감님의 프로필 이미지
최원감

작성한 질문수

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

퀴즈 #8

퀴즈 8번 질문합니다ㅜㅜ

작성

·

262

0

SpeedCam 클래스내에서 AccidentDetector와 VideoReporter 를 사용하기 위해 인스턴스 변수를 만든 뒤 setter를 사용하는 것까진 이해를 했습니다.

public void setDetector(Detectable detector) { // 질문
        this.detector = detector;
    }

위의 코드에서 괄호안의 Detectable detector가 매개변수라고 이해했는데 정확히 어떤 역할인지 명확하게 이해가 되지 않아서 질문합니다..ㅜㅜ

답변 1

2

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

안녕하세요?
메소드는 어떤 기능을 하는 코드들의 묶음입니다. 경우에 따라 코드의 양이 적을 수도 있고 많을 수도 있지만 일반적으로는 작은 단위의 기능을 하나의 메소드로 정의하는 것을 권하는데요. 메소드를 수행하기 위해서는 아무런 값을 전달하지 않을 수도 있고 어떤 값을 전달할 수도 있습니다. 그리고 메소드 내에서 수행된 코드의 결과를 메소드를 호출한 쪽으로 반환할 수도 있고 필요하지 않은 경우 반환을 하지 않을 수도 있습니다.

전달값(=매개변수)은 기본 자료형 또는 참조 자료형이 올 수 있는데, setDetector() 메소드의 매개변수인 Detectable detector 는 참조 자료형입니다. 참조는 메모리 공간의 어딘가에 만들어진 위치를 가리키는 것으로 이해하시면 되는데, 여기서는 new AccidentDetector() 라는 코드에 의해 메모리 공간의 어딘가에 만들어진 객체를 참조하게 되는 것입니다.

사실 이 코드를 setter 가 아닌 그냥 메소드 내에서 적는다면 이렇게 하는 것과 다르지 않습니다.

Detectable detector = new AccidentDetector();

즉 AccidentDetector 라는 객체를 detector 라는 이름으로 사용할 수 있게 되는 것이죠. 만약 사고 감지가 아닌 화재 감지 기능을 장착하고 싶다면 다음과 같이 할 수 있습니다.

Detectable detector = new FireDetector();

또는 보다 향상된 화재 감지 기능이라면 이렇게 할 수 있구요.

Detectable detector = new AdvancedFireDetector();

detector 는 등호(=) 뒤에 오는 객체의 종류에 따라 서로 다른 목적의 여러 가지 기능을 사용할 수 있으며 이는 다형성에 의해 가능해집니다. 3개의 서로 다른 감지 클래스가 모두 Detectable 이라는 인터페이스를 구현함으로써 가능해지는 것이죠. 이 문장을 퀴즈에서는 메소드를 이용하여 setDetector() 안에 Detectable detector 변수를 정의하고, 메소드를 호출할 때 new AccidentDetector() 를 넣어주는 형태로 수행한 것뿐입니다.

다시 질문으로 돌아가서,
setDetector() 메소드의 매개변수로 전달되는 값은 new AccidentDetector(), new FireDetector(), new AdvancedFireDetector() 등 Detectable 인터페이스를 구현하는 클래스라면 무엇이든지 들어갈 수 있으며 이를 통해 SpeedCam 객체를 생성할 때 detector 변수에 어떤 객체를 대입할지, 즉 어떤 감지 기능을 장착할지 정할 수 있게 되는 것입니다.

이해가 되셨을까요? 😊
감사합니다.

최원감님의 프로필 이미지
최원감

작성한 질문수

질문하기