작성
·
262
답변 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 변수에 어떤 객체를 대입할지, 즉 어떤 감지 기능을 장착할지 정할 수 있게 되는 것입니다.
이해가 되셨을까요? 😊
감사합니다.