[TIL] 함수형 인터페이스 FunctionalInterface, Logger

2025-03-05 TIL

📝 TIL (Today I Learned)
🔗 원본 이슈: #21
📅 작성일: 2025-03-05
🔄 최종 수정: 2025년 04월 08일


🍀 새롭게 배운 것

  • 함수형 인터페이스
    • @FunctionalInterface

@FunctionalInterfaceJava에서 함수형 인터페이스를 명시적으로 선언할 때 사용하는 어노테이션입니다.

1. 함수형 인터페이스란?

  • 추상 메서드를 단 하나만 가지는 인터페이스입니다.
  • 람다 표현식과 메서드 레퍼런스를 사용할 수 있게 해줍니다.
  • @FunctionalInterface 어노테이션을 사용하면 컴파일러가 함수형 인터페이스 규칙을 강제합니다.
  • 함수형 인터페이스인지 검증해줍니다.
  • 만약 두 개 이상의 추상 메서드를 선언하면 컴파일 오류가 발생합니다.
@FunctionalInterface
interface InvalidInterface {
    void method1();
    void method2(); // 오류 발생: 함수형 인터페이스는 추상 메서드가 하나만 있어야 함!
}
java: Unexpected @FunctionalInterface annotation

대표적인 함수형 인터페이스 예제 (Java 기본 제공)

  • Runnable (메서드: void run())
  • Callable<T> (메서드: T call())
  • Supplier<T> (메서드: T get())
  • Consumer<T> (메서드: void accept(T t))
  • Function<T, R> (메서드: R apply(T t))
  • Predicate<T> (메서드: boolean test(T t))
Function<String, Integer> lengthFunction = str -> str.length();
System.out.println(lengthFunction.apply("Hello")); // 5

@FunctionalInterface를 꼭 써야 하나요?

아니요. 어노테이션 없이도 함수형 인터페이스는 작동합니다. 하지만 @FunctionalInterface를 사용하면 가독성이 좋아지고, 실수를 방지할 수 있습니다.
즉, “이 인터페이스는 함수형 인터페이스다”라고 명시적으로 선언하는 용도입니다.

✅ 사용하면 좋은 경우:

  • 팀원에게 코드의 의도를 명확히 전달하고 싶을 때
  • 실수로 여러 개의 추상 메서드를 선언하는 것을 방지하고 싶을 때

결론

@FunctionalInterface는 단 하나의 추상 메서드를 가지는 함수형 인터페이스를 선언할 때 사용하며, 컴파일러가 이를 검증해 주는 역할을 합니다.
람다와 함께 사용하면 코드를 더 간결하게 작성할 수 있습니다! 🚀

  • Logger가 System.out.println보다 좋은 점
    • Logger는 println보다 훨씬 강력하고 유용한 기능을 제공

Logger vs println 비교

구분LoggerSystem.out.println
출력 방식로그 레벨별로 출력 가능단순한 콘솔 출력
출력 조절필요에 따라 로그 출력 On/Off 가능항상 출력됨
로그 파일 저장가능 (파일로 기록 가능)직접 파일에 저장하려면 추가 코드 필요
출력 포맷형식 지정 가능 (날짜, 로그 레벨, 클래스명 포함 가능)단순 문자열 출력
병렬 처리멀티스레드 환경에서 안전하게 사용 가능동기화가 필요할 수 있음
성능대량의 로그를 효율적으로 처리 (필요하지 않은 로그는 출력하지 않고, 비동기적으로 처리할 수도 있어 성능이 우수)성능 최적화 없음
예외 처리log.log(Level.SEVERE, "Error", exception) 처럼 예외 정보를 함께 로깅 가능예외 출력은 e.printStackTrace()로 별도로 해야 함

언제 Logger를 써야 할까?

상황Logger 사용 여부
간단한 테스트 출력System.out.println 사용
디버깅 / 오류 분석Logger 사용
운영 환경 로그 기록Logger 필수
멀티스레드 프로그램Logger 사용
로그 파일 저장 필요Logger 사용