• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

인터페이스 변수

23.04.08 23:05 작성 조회수 385

0

 화면 캡처 2023-04-08 225447.png안녕하세요~ 강사님, 인터페이스(후반전) 강의를 듣고 있는데, 왜 인터페이스 변수를 만드는지 이해가 가지 않습니다.

수업 내용에서 FactoryCam이 인터페이스 Detectable과 Reportable을 구현하여 인터페이스에 있는 메소드를 FacstoryCam에서 구현해야한다는 것은 이해했습니다.

그리고 다른 클래스의 detect 메소드와 report 메소드를 호출하는것이라서 public void detect(){detecter.detect();} 이고, detecter은 객체이잖아요. 여기서 막힙니다. 이 객체랑 인터페이스 변수랑 무슨 상관인지? FactoryCam 의 인터페이스 변수를 생성해서 변수에 값 저장하는 걸로 하면 되지 않는지? 왜 인터페이스 변수를 선언해서 거기다가 값을 저장하는지, 잘 이해가 안 됩니다....

ㅠㅠ

 

그리고 추가로, 인터페이스로 다중 상속이 가능하다고 하셨는데, 수업 내용 중 어떤 것이 다중 상속이 되고 있는지 파악하기가 어렵습니다. 혹시, 다른 클래스의 메소드를 호출할 수 있는 부분때문에 다중 상속이 가능한 것인가요?

후반부로 갈수록 어렵네요 ㅠㅠ

답변 1

답변을 작성해보세요.

0

안녕하세요?

detect 를 가지고 설명드리자면 FactoryCam 클래스에 정의된 detect() 메소드에서는 다른 클래스(FireDetector 또는 AdvancedFireDetector) 로부터 만들어진 객체의 detect() 메소드를 호출하는 것입니다.

public void detect() {
    detector.detect(); // FireDetector 또는 AdvancedFireDetector
}

이때 detector 는 FactoryCam 클래스 내에서 인터페이스 변수로 선언을 하였지요.

private Detectable detector;

그리고 이는 setter 를 통해서 값을 대입하게 됩니다.

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

정리하면 다음과 같습니다.

1. FactoryCam 에는 화재 감지 기능이 존재한다
2. setDetector() 를 통해 카메라에 화재 감지 기능(또는 센서)을 장착한다.
: 이때 일반 감지기(FireDetector)가 있고 고성능 감지기(AdvancedFireDetector)가 있을 수 있다.
3. detect() 를 통해 화재 감지를 한다.
: 이때 어떤 감지기인지는 알 수 없지만 아무튼 장착된 감지기 detector 의 detect() 기능을 활용한다.

FireDetector 와 AdvancedFireDetector 모두 Detectable 인터페이스를 구현하므로 setDetector 의 전달값으로 받을 수 있는 것이며, 나중에 새로운 화재 감지기가 등장한다면 이 또한 FactoryCam 클래스의 setDetector() 메소드에는 아무런 변경 없이 그대로 사용할 수 있게 됩니다.

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

그러니까 FactoryCam 에는 Detectable 인터페이스 변수인 detector 가 있으며, 여기에 어떤 형태로든 Detector 라는 인터페이스를 구현하는 클래스 객체를 설정할 수 있게 되는 것입니다. 그러면 그 객체는 화재 감지 기능이 있는 것이구요. 마치 우리가 자동차에 타이어를 장착하는데 일반 타이어를 장착할 수도 있고 겨울에 스노우 타이어를 장착할 수도 있습니다. 모두 규격만 같으면 어떤 타이어를 장착하든 자동차 입장에서는 그냥 달려 있는 타이어를 굴리면 되는 것인거죠.

"FactoryCam 의 인터페이스 변수를 생성해서 변수에 값 저장하는 걸로 하면 되지 않는지?" 질문은 제가 정확히 이해가 되지 않습니다. 어떤 질문이신지 구체적인 코드를 예시로 다시 질문주시면 답변 드리겠습니다.

그리고 클래스는 단일 상속만 가능하고 인터페이스는 다중 상속이 가능하다고 설명드렸는데, 상속이란 부모 클래스의 기능을 그대로 사용하는 것입니다. 그리고 부모는 하나만 설정할 수 있는 게 단일 상속이며, 여럿 설정하게 되면 그것이 다중 상속입니다. 자바에서 클래스는 단일 상속만 가능하므로 FactoryCam 에서 다음과 같이 여러 개의 클래스를 상속하려고 하면 오류가 발생하게 됩니다. (편의상 Camera2, Camera3 라는 클래스가 있다고 가정하겠습니다.)

public class FactoryCam extends Camera, Camera2, Camera3 // 1개만 가능
{ ... }

하지만 인터페이스는 다중 상속(여기서는 구현 = implementation) 이 가능합니다. 우리 예제에서는 코드로 작성해주신 이 부분으로 이해하시면 되겠습니다. FactoryCam 은 Detectable 이라는 기능, Reportable 이라는 기능을 모두 가질 수 있게 되는 것입니다. 물론 구체적인 구현부는 직접 코드로 작성을 해야 합니다.

public class FactoryCam implements Detectable, Reportable // 여러 개 가능
{ ... }

참고로 인터페이스끼리의 다중 상속은 이런 형태로 가능하다는 것도 알아두시면 좋겠습니다.

interface A { ... }

interface B { ... }

interface C extends A, B { ... }

여전히 어려운 부분이 있다면 다시 질문주시면 도움드리겠습니다 😊

감사합니다.