티스토리 뷰

Java의 Functional Interface란 1개의 추상메서드를 가진 인터페이스를 얘기합니다. 이번 글에서는 Functional Interface에 대해 새롭게 알게 된 내용을 공유하고자 합니다.

 

 

예제

위 소스를 보시면 반환 타입int인 1개의 추상메서드가 있고 @FunctionalInterface가 선언되어 있습니다. @FunctionalInterface를 선언하면 컴파일러에게 이 인터페이스는 단 1개의 추상메서드만 허용하는 Functional Interface라는걸 알립니다.

 

 

만약에 추상메서드를 2개 이상 작성할 경우 위와 같은 컴파일 에러를 내뱉게 됩니다. 

이번에는 num2() 라는 추상메서드를 지우고 또 다른 추상메서드를 추가해보도록 하겠습니다.

 

 

이번엔 아까처럼 컴파일 에러가 발생하지 않았습니다. 왜 컴파일 에러가 발생하지 않을까요?

정답은 @FunctionalInterface의 주석에 나와 있습니다.

 

 

인터페이스가 Object 클래스에 있는 public 메서드를 추상메서드로 재정의할 경우 해당 인터페이스의 어떤 구현클래스가 와도 Object 클래스의 메서드를 재정의하기 때문에 추상메서드에 카운트되지 않습니다.

 

 

Functional Interface도 결국 인터페이스이며 인터페이스의 메서드는 해당 인터페이스를 구현한 클래스가 호출합니다.

Java의 모든 클래스는 Object 클래스를 상속받고 Object 클래스의 public 메서드를 호출할 수 있습니다.

 

위 코드처럼 Lambda 표현식으로 작성하면 인터페이스에 정의된 1개의 추상메서드를 참조하는데 Object 클래스의 public 메서드를 추상메서드로 재정의할 경우 Functional Interface를 구현한 클래스가 Object 클래스의 메서드를 호출하기 때문에 추상메서드가 여러 개 선언되어도 컴파일 에러가 발생하지 않은 것 같습니다.

 

 

위 사진의 오른쪽은 Java의 대표적인 Functional Interface인 Predicate 인터페이스입니다. 스펙을 보시면 반환 타입이 boolean이고 매개변수가 하나 있는 추상메서드가 있습니다.

 

메서드 이름을 보시면 test라고 되어있는데 아마 이름을 test로 한 이유가 동일성 및 동등성을 표현하기 위해 equals를 사용하고 싶었으나 그게 안 되니까 test를 쓴 것 같습니다.

 

이건 제 개인적인 추측입니다. ㅋㅋ

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함