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

흰머리오목눈이님의 프로필 이미지

작성한 질문수

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

인터페이스 (후반전)

강사님 질문 있습니다!

해결된 질문

작성

·

507

0

 항상 이 부분에서 이해가 안되서 답답한 마음을 안고 지내고 있습니다 🥲

구문 1.

Reportable factoryCam = FactoryCam();

구문 2.

FactoryCam factoryCam = FactoryCam();

 

구문 1과 구문 2의 차이점이 무엇인지 알 수 있을까요? 기능적인 부분은 이해했습니다. 구문 1의 경우, FactoryCam 이 Reportable 인터페이스를 상속받았으니, Reportable 로 참조를 해서 접근할 수 있다.. 라고는 이해를 했는데요.

저 두 개가 달라지는 것에 대한 개념을 좀 설명 부탁드려도 괜찮을까요?

제가 어렴풋이 이해하는 개념은 접근 경로 같은 개념인데, 이게 맞을까요?

답변 2

1

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

안녕하세요?
답답하신 마음 충분히 이해합니다. 어려운 내용이므로 이렇게 계속 질문 주시면서 하나씩 퍼즐조각 맞춰가듯이 공부하시는 것도 매우 좋은 방법입니다.

먼저 Reportable 은 인터페이스입니다. FactoryCam 클래스가 이를 구현하고 있으므로 구문 1이 가능합니다. 제가 임의로 구문 1을 아래와 같이 바꿔볼게요.

Reportable reportable = new FactoryCam();

그런데 Reportable 의 인터페이스에는 다음과 같이 report 라는 신고 기능이 제공되고 있지요.

public interface Reportable {

    void report(); // 신고

}

그러면 reportable.report(); 코드를 통해 신고 기능을 실행할 수 있습니다.
(※ setReporter() 는 이미 호출된 것으로 가정하겠습니다.)

다음으로 FactoryCam 은 클래스입니다. 등호를 기준으로 좌항 우항의 관계가 부모/자식 클래스이거나 동등한 클래스인 경우 이와 같이 객체를 생성할 수 있습니다.

FactoryCam factoryCam = FactoryCam();

그런데 FactoryCam 클래스에는 다음과 같이 detect() 라는 화재 감지 기능이 제공되고 있네요.
(※ 학습 진도에 따라 다른 메소드가 제공될 수 있습니다. 여기서는 detect() 를 예로 들겠습니다.)

public class FactoryCam extends ... implements ... {
    ...

    @Override
    public void detect() {
        detector.detect();
    }

    ...
}

그러면 factoryCam.detect(); 코드를 통해 화재 감지 기능을 실행할 수 있습니다.

즉, 등호(=) 기준으로 왼쪽에 작성된 클래스 또는 인터페이스에 따라 사용 가능한 기능이 달라질 수 있다는 게 한 가지 특징이구요.

또 한 가지 특징은, 메소드로 생각하면 쉽습니다.
만약에 작성자분께서 신고 기능이 있는 수많은 기기들을 테스트하는 입장이라고 해보겠습니다. 가령 범죄율이 높은 동네의 전봇대에 설치되어 있는 신고 기기라거나, 차량에 설치된 충격 감지 센서를 통해 사고 의심 상황 발생 시 자동 긴급 구조 신고라거나, 지진이 감지되어 전국민에게 알림이 가는 기기 등 다양한 예가 있을 수 있는데요.
이들은 제각각 서로 다른 기능과 생김새를 가지고 있을 겁니다. 하지만 만약 내부 소프트웨어가 Reportable 이라는 인터페이스를 구현했다면, 다음과 같은 메소드 하나로 '신고 기능'에 대해서는 확인을 해 볼 수 있겠네요.

public void testReport(Reportable reportableDevice) {
    reportableDevice.report();
}

만약 이들이 Reportable 인터페이스를 구현하지 않았다면 어떨까요?

ReportCrime reporter1 = new ReportCrime(); // 범죄 신고
ReportAccident reporter2 = new ReportAccident(); // 사고 신고
ReportEarthQuake reporter3 = new ReportEarthQuake(); // 지진 신고

테스트를 위해서는 다음과 같이 3개의 메소드가 필요할 것입니다.

// 범죄 신고 테스트
public void testReportCrime(ReportCrime reporter) {
    reporter.report();
}

// 사고 신고 테스트
public void testReportAccident(ReportAccident reporter) {
    reporter.report();
}

// 지진 신고 테스트
public void testReportEarthQuake(ReportEarthQuake reporter) {
    reporter.report();
}

호출도 각각 해줘야겠네요.

ReportCrime reporter1 = new ReportCrime(); // 범죄 신고
ReportAccident reporter2 = new ReportAccident(); // 사고 신고
ReportEarthQuake reporter3 = new ReportEarthQuake(); // 지진 신고

testReportCrime(reporter1); // 범죄 신고 테스트 메소드 호출
testReportAccident(reporter2); // 사고 신고 테스트 메소드 호출
testReportEarthQuake(reporter3); // 지진 신고 테스트 메소드 호출

이런 기기가 100개라면 100개의 서로 다른 메소드, 100번의 서로 다른 형태의 호출이 필요할 것입니다. 하지만 인터페이스를 이용하면 인터페이스에 명시된 report() 기능이 있으므로 메소드 하나로 모든 기기에 대한 테스트가 가능하겠죠.

이번 설명은 이해가 조금 되실지요? 😊
또 질문 남겨주세요.

감사합니다.

아 드디어 완전 이해했습니다. 강사님...!

이전에 문의드린 instanceof 까지 이해했습니다..! 감사합니다, 강사님!! ㅠㅠㅠ

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

🙌 와우!! 축하드립니다 😊 큰 언덕을 넘으셨어요!
포기하지 않고 끝까지 이해하려고 노력하신 덕분에 흰머리오목눈이 님의 지식이 될 수 있었습니다. 앞으로도 이렇게 공부하시면 정말 많은 것을 얻어가실 수 있을거라 확신합니다. 최고에요 👍

1

In the first line, you can only access methods/variables defined in the Reportable interface.

In the second line, you can access methods/variables defined in the FactoryCam class which could be larger than Reportable.