[java] 자바 함수형 인터페이스를 사용하여 유연한 로깅을 구현하는 방법은 어떻게 되나요?

로그를 출력하는 공통 기능을 가진 함수형 인터페이스를 정의하면, 해당 인터페이스를 구현하여 다양한 로그 메시지를 처리할 수 있습니다. 이렇게 하면 로깅 로직을 변경할 때마다 기존 코드를 수정하지 않고도 유연하게 대처할 수 있습니다.

다음은 자바 함수형 인터페이스를 사용하여 유연한 로깅을 구현하는 예제 코드입니다.

@FunctionalInterface
interface Logger {
    void log(String message);
}

class FileLogger implements Logger {
    @Override
    public void log(String message) {
        // 파일에 로그 메시지를 기록하는 코드 작성
        System.out.println("File Logger: " + message);
    }
}

class ConsoleLogger implements Logger {
    @Override
    public void log(String message) {
        // 콘솔에 로그 메시지를 출력하는 코드 작성
        System.out.println("Console Logger: " + message);
    }
}

class Application {
    private Logger logger;

    public Application(Logger logger) {
        this.logger = logger;
    }

    public void doSomething() {
        logger.log("Doing something...");
        // 작업 수행 코드 작성
    }
}

public class Main {
    public static void main(String[] args) {
        Logger fileLogger = new FileLogger();
        Logger consoleLogger = new ConsoleLogger();

        Application app1 = new Application(fileLogger);
        app1.doSomething();

        Application app2 = new Application(consoleLogger);
        app2.doSomething();
    }
}

위의 예제에서는 Logger라는 함수형 인터페이스를 정의하였습니다. FileLogger와 ConsoleLogger는 Logger 인터페이스를 구현하여 각각 파일과 콘솔에 로그를 출력하는 동작을 구현하였습니다.

Application 클래스는 Logger 인터페이스를 사용하여 로깅을 수행합니다. 생성자를 통해 원하는 로깅 방식을 주입할 수 있으며, doSomething 메서드를 호출할 때마다 해당 로깅 방식에 따라 로그를 출력합니다.

이와 같이 자바 함수형 인터페이스를 활용하면 로깅과 같은 공통 기능을 유연하게 처리할 수 있습니다.