본문 바로가기
프로그래밍/kotlin

[kotlin] 코틀린 차곡차곡 - 19. Functional (SAM) interfaces

by 사바라다 2023. 2. 7.

안녕하세요 ! 오늘은 이전 시간에 이어서 코틀린 Functional interfaces에 대해서 알아보도록 하겠습니다.

Functional Interfaces 란 ?

Functional Interface는 Java 8 부터나온 개념입니다. 이 개념은 그대로 kotlin에서도 사용이 가능합니다. Java의 Functional Interface의 개념이 궁금하신 분은 이전에 제가 이전에 아래 2개의 포스팅을 작성한 적이 있습니다. 해당 포스팅을 참고해주시기 바랍니다.

functional interface는 interface에 1개의 추상화 메서드만 있는 interface를 부르는 말입니다. 이렇게 만들어진 interface는 다른 interface와는 다르게 사용하는 입장에서 간단하고 쉽게 사용할 수 있습니다. 또 다른 이름으로는 Single Abstract Method라고도 부릅니다.

형태

functional interface의 구조는 아래 코드와 같습니다.

fun interface EmailStringPredicate {
    fun accept(value: String): Boolean
}
  • interface 앞에 fun 이라는 keyword가 붙습니다.
  • 1개의 function을 가집니다
  • 0개 또는 2개 이상의 내부 function을 가지면 컴파일에러가 발생합니다.
  • 1개의 function은 return값을 가질 수 있습니다.

예제

위에서 만든 Functional Interface를 사용하는 방법에는 object class를 이용하는 방법과 lambda를 이용하는 방법, 이렇게 2가지가 있습니다. 먼저 아래 테스트 코드를 보도록 하겠습니다. 아래 테스트 코드는 functional interface를 object class로 사용하는 방법입니다.

@Test
fun `test_email_String_check_functional_interface`() {

    val isEven = object : EmailStringPredicate { // functional interface를 object class 화
        override fun accept(value: String): Boolean {
            return Pattern.matches("^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$", value)
        }
    }

    assert(isEven.accept("koangho93@naver.com")) // true
}
@Test
fun `test_email_String_check_functional_interface`() {

    val isEven = EmailStringPredicate { value -> // functional interface를 lambda 화
        Pattern.matches("^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$", value) 
    }

    assert(isEven.accept("koangho93@naver.com")) // true
}

마무리

오늘은 이렇게 코틀린의 19번째 시간으로 Functional Interface에 대해서 간단하게 알아보는 시간을 가져보았습니다.

감사합니다.

참조

[1] https://kotlinlang.org/docs/fun-interfaces.html

[2] https://kotlinlang.org/docs/lambdas.html#lambda-expressions-and-anonymous-functions

댓글