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

seoys0910님의 프로필 이미지
seoys0910

작성한 질문수

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

인터페이스 질문입니다

작성

·

374

·

수정됨

0

안녕하세요 나도코딩 강사님

인터페이스 강의를 듣다가 이해가 안가는 부분이 많아서 질문드립니다

챕터8의 02인터페이스 코드 부분에서

 

질문 1 :

Detectable fireDetector = new FireDetector();

Detectable advancedFireDetector = new AdvancedFireDetector();

FactoryCam factoryCam = new FactoryCam();
factoryCam.setDetector(fireDetector);
factoryCam.setReporter(normalReporter);

코드 첫번째줄을 해석하면

Detectable 이라는 인터페이스를 구현하는 FireDetector 클래스로부터 fireDetector 객체를 생성한 것이라고 이해하는게 맞는건가요?

질문 2 :

public class FactoryCam extends Camera implements Detectable, Reportable {

    private Detectable detector;
    private Reportable reporter;

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

    public void setReporter(Reportable reporter) {
        this.reporter = reporter;

FactoryCam 클래스에서 인터페이스 변수들(Detectable, Reportable)을 선언해주고

setter 메소드를 만들어서 매개변수로 Detectable 이라는 인터페이스 변수인 detector를 전달받게 했는데

FactoryCam factoryCam = new FactoryCam();
factoryCam.setDetector(fireDetector);
factoryCam.setReporter(normalReporter);

메인 메소드에서 setDetector() 와 setReporter() 메소드의 전달값으로 왜 인터페이스 변수(Detectable, Reportable)를 전달해주지 않고

클래스로부터 생성된 객체인 fireDetector 와 normalReporter를 전달값으로 전해주는지 이해가 안됩니다

 

답변 1

0

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

안녕하세요?

질문 1

Detectable fireDetector = new FireDetector();

라는 문장은 등호(=)를 기준으로 오른쪽에 있는 값을 왼쪽에 대입하라는 의미가 됩니다. 등호 오른쪽의 new FireDetector(); 는 FireDetector 라는 클래스로부터 어떤 객체를 만들라는 의미가 됩니다. 이렇게 하면 메모리 공간의 어딘가에 객체가 만들어집니다. 그리고 이 객체를 등호 왼쪽의 Detectable fireDetector 에 대입하여 fireDetector 라는 이름의 변수로 객체를 참조할 수 있게 되는 것입니다.

그래서 Detectable 이라는 인터페이스를 구현하는 FireDetector 클래스로부터 객체를 생성하고 이를 fireDetector 라는 이름의 변수로 참조한다 라고 보시면 됩니다.


질문 2

앞의 질문과 이어지는 답변인데요.
FactoryCam 클래스에는 이러한 메소드들이 구현되어 있습니다,

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

public void setReporter(Reportable reporter) {
    this.reporter = reporter;
}

그리고 메인 메소드에서 이들을 다음과 같이 사용하죠.

factoryCam.setDetector(fireDetector);
factoryCam.setReporter(normalReporter);

이때 fireDetector 와 normalReporter 는 이미 이런 형태로 만들어져 있습니다.

Detectable fireDetector = new FireDetector();
Reportable normalReporter = new NormalReporter();

각 문장의 등호 오른쪽에 new 를 통해 객체를 만든 것을 확인할 수 있는데요. 사실 앞에서 작성된 코드는 다음 문장과 동일한 역할을 수행하게 됩니다.

// FactoryCam 내에 정의된 인스턴스 변수 detector, reporter
Detectable detector = new FireDetector();
Reportable reporter = new NormalReporter();

다만 메소드 형태로 되어 있기 때문에 메소드를 호출할 때 new FireDetector(), new NormalReporter() 를 통해 만들어진 객체들을 참조하는 변수인 fireDetector 와 normalReporter 를 넣어주는 것이죠.

"왜 인터페이스 변수(Detectable, Reportable)를 전달해주지 않나요?" 라는 질문에서, Detectable 과 Reportable 은 인터페이스 변수가 아니라 인터페이스 그 자체입니다. 클래스 또는 인터페이스는 그저 설계도, 설명서 정도의 역할이지 이들 자체가 객체인 것은 아니에요.
우리가 어떤 조립 장난감(레고 등)을 사게 되면 설명서를 따라 조립을 해야 하는데 설명서만 가지고는 만들 수 없는 것처럼, 인터페이스만 가지고는 뭔가를 할 수 없고 이로부터 객체를 만들어야만 사용할 수 있게 됩니다.
그래서 Detectable, Reportable 이 아니라 이들로부터 만들어진 객체인 fireDetector, normalReporter 를 사용한 것이죠.

다시 앞의 코드로 돌아와서, 이것이 올바른 객체 생성 방법입니다.

Detectable detector = new FireDetector();
Reportable reporter = new NormalReporter();

그리고 질문주신 내용은 왜 아래와 같이는 할 수 없는지를 물어보시는 것 같아요.
앞서 말씀드린 것처럼 인터페이스는 그 자체만으로 바로 사용할 수는 없기 때문에 아래 문장은 수행할 수 없습니다.

Detectable detector = FireDetector;
Reportable reporter = NormalReporter;

물론 다음과 같이는 할 수 있습니다.

Detectable fireDetector = new FireDetector();
Reportable normalReporter = new NormalReporter();

Detectable detector = fireDetector;
Reportable reporter = normalReporter;

설명이 다소 길어졌는데 천천히 차근 차근 읽어보시기를 권해드려요.
제 답변이 궁금증 해결에 도움되시길 바라겠습니다 😊
감사합니다.

seoys0910님의 프로필 이미지
seoys0910

작성한 질문수

질문하기