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

Ambition님의 프로필 이미지
Ambition

작성한 질문수

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

함수형 인터페이스 (전반전)

안녕하세요 지난 시간에 배운 인터페이스(후반전)을 함수형 인터페이스로 만들어보았습니다.

작성

·

270

1

 

(메인 클래스 부분 아래로 내려가지지 않아서 실행 결과를 여기에 먼저 올립니다 😅)

참고로, 함수형 인터페이스를 사용할 때는 아래와 같이 함수 시그니처(함수 이름, 반환형, 파라미터 타입)만 동일하고 바디 부분은 달라도 정상적으로 실행이 되더군요.

📋Reportable 인터페이스

package practice;

@FunctionalInterface
public interface Reportable {
    void report(int time); // 신고
}

📋Detectable 인터페이스

package practice.detector;

@FunctionalInterface
public interface Detectable {
    String name = "감지자"; // 인터페이스도 필드를 가질 수 있음
    void detect(); // 감지
}

💻NormalReporter 클래스

package practice;

public class NormalReporter implements Reportable
{
    @Override
    public void report(int time) {
        System.out.println(time + " 초 동안 일반 화재 신고를 진행합니다.");
    }
}

💻VideoReporter 클래스

package practice;

public class VideoReporter implements Reportable {
    @Override
    public void report(int time) {
        System.out.println("직전 " + time +  "초 영상과 함께 신고를 진행합니다.");
    }
}

💻FireDetector 클래스

package practice.detector;

public class FireDetector implements Detectable{

    @Override
    public void detect() {
        System.out.println("일반 성능으로 화재를 감지합니다.");
    }
}

💻AdvancedFireDetector 클래스

package practice.detector;

public class AdvancedFireDetector implements Detectable{

    @Override
    public void detect() {
        System.out.println("향상된 성능으로 화재를 감지합니다.");
    }
}

💻메인 클래스

package practice;

import practice.detector.Detectable;

public class practice {
    public static void main(String[] args) {

        //* 함수형 인터페이스 실행
        Reportable reportableNormal = (time) -> System.out.println(time + " 초 동안 일반 화재 신고를 진행합니다.");
        Reportable reportableVideo = (time) -> System.out.println("직전 " + time +  "초 영상과 함께 신고를 진행합니다.");
        Detectable detectableFire =   () -> System.out.println("일반 성능으로 화재를 감지합니다.");
        Detectable detectableAdvancedFire =   () -> System.out.println("향상된 성능으로 화재를 감지합니다.");

        reportbyNormalReporter(reportableNormal, 20);
        reportbyVideoReporter(reportableVideo, 10);
        detectbyFireDetector(detectableFire);
        detectbyAdvancedFireDetector(detectableAdvancedFire);
    }

    public static void reportbyNormalReporter(Reportable reporter, int time) {
        reporter.report(time);
    }

    public static void reportbyVideoReporter(Reportable reporter, int time) {
        reporter.report(time);
    }

    public static void detectbyFireDetector(Detectable detector) {
        detector.detect();
    }

    public static void detectbyAdvancedFireDetector(Detectable detector) {
        detector.detect();
    }
}

답변 1

0

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

안녕하세요?
배운 내용을 복습하면서 직접 응용해보시는 것은 개발 공부에 매우 큰 도움이 됩니다. 함수형 인터페이스로 잘 구현해주셨는데 아마 연습하시는 과정에서 다른 클래스들도 더 이상 필요하지 않은데 남겨두신 것 같아서 코드를 다음과 같이 조금 간소화 하였습니다. 또한 Reportable 과 Detectable 을 받는 메소드는 2개면 충분할 것 같아서 나머지 2개는 삭제하고 메소드 이름을 변경해보았으니 참고 바랍니다 😊

@FunctionalInterface
public interface Reportable {
    void report(int time); // 신고
}
@FunctionalInterface
public interface Detectable {
    void detect(); // 감지
}
public class Practice {
    public static void main(String[] args) {

        //* 함수형 인터페이스 실행
        Reportable reportableNormal = (time) -> System.out.println(time + " 초 동안 일반 화재 신고를 진행합니다.");
        Reportable reportableVideo = (time) -> System.out.println("직전 " + time +  "초 영상과 함께 신고를 진행합니다.");
        Detectable detectableFire =   () -> System.out.println("일반 성능으로 화재를 감지합니다.");
        Detectable detectableAdvancedFire =   () -> System.out.println("향상된 성능으로 화재를 감지합니다.");

        reportbyReporter(reportableNormal, 20);
        reportbyReporter(reportableVideo, 10);
        detectbyDetector(detectableFire);
        detectbyDetector(detectableAdvancedFire);
    }

    public static void reportbyReporter(Reportable reporter, int time) {
        reporter.report(time);
    }

    public static void detectbyDetector(Detectable detector) {
        detector.detect();
    }
}

실행 결과는 다음과 같습니다.

20 초 동안 일반 화재 신고를 진행합니다.
직전 10초 영상과 함께 신고를 진행합니다.
일반 성능으로 화재를 감지합니다.
향상된 성능으로 화재를 감지합니다.

감사합니다.

Ambition님의 프로필 이미지
Ambition
질문자

아! 그러네요 이미 참조 객체 변수에 1:1 매핑을 해놨으니 report하고 detect 2개의 함수만 있으면되겠네요 피드백 주셔서 감사합니다 😄

Ambition님의 프로필 이미지
Ambition

작성한 질문수

질문하기