κΉ¨μ•Œ κ°œλ… πŸ“‘/Kotlin

[Kotlin] ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Single Abstract Method Interface)

interfacer_han 2024. 1. 30. 13:14

#1 일반 μΈν„°νŽ˜μ΄μŠ€

#1-1 ν‰λ²”ν•œ μΈν„°νŽ˜μ΄μŠ€

interface MyNormalInterface {
    fun myFirstMethod(value: Int): String
    fun mySecondMethod(value1: Int, value2: String): Int
    
    ...
}

μš°λ¦¬κ°€ 잘 μ•Œκ³ μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨μŠ΅μ΄λ‹€.

 

#1-2 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 후보

// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ ν˜•νƒœμ§€λ§Œ, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” μ•„λ‹˜
interface MyFunctionalInterfaceCandidate {
    fun myMethod(value1: Int, value2: Int): Int
}

가진 λ©”μ†Œλ“œκ°€ 좔상 λ©”μ†Œλ“œ ν•˜λ‚˜λΏμΈ μΈν„°νŽ˜μ΄μŠ€(Single Abstract Method, SAM)λ₯Ό νŠΉλ³„νžˆ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  λΆ€λ₯Έλ‹€. ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ‚¬μš©ν•  ν•¨μˆ˜κ°€ 가지고 μžˆλŠ” ν•˜λ‚˜μ˜ ν•¨μˆ˜λ‘œ 밖에 κ²°μ •λ˜μ§€ μ•ŠμœΌλ‹ˆ, MyFunctionalInterface 자체λ₯Ό myMethod()라고 μƒκ°ν•œλ‹€. κ·Έλž˜μ„œ 'ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€'λΌλŠ” 이름이 λΆ™μ—ˆλ‹€.

 

ν•˜μ§€λ§Œ, 이 논리라면 가지고 μžˆλŠ” ν•˜λ‚˜λΏμΈ λ©”μ†Œλ“œκ°€ 좔상 λ©”μ†Œλ“œκ°€ μ•„λ‹ˆμ–΄λ„ 'ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€'라고 λΆ€λ₯Ό μˆ˜λ„ μžˆλŠ” 것 μ•„λ‹ˆλƒλŠ” 의문이 생긴닀. ν•˜μ§€λ§Œ, κ·Έ κ²½μš°μ—” κ·Έλƒ₯ κ·Έ ν•¨μˆ˜λ₯Ό λ°”λ‘œ ν˜ΈμΆœν•˜λ©΄ κ·Έλ§Œμ΄λ‹€. λ”°λΌμ„œ ꡳ이 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌλŠ” κ°œλ…μ„ λ§Œλ“€ ν•„μš”μ‘°μ°¨ μ—†λ‹€. 결둠적으둜, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„ κ°€λŠ₯ν•œ ν•¨μˆ˜κ°€ ν•˜λ‚˜ 뿐인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μš©μ–΄λ‹€.

 

ν—ˆλ‚˜ μœ„ μ½”λ“œλŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ μ•„λ‹ˆλ‹€. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ 될 수 μžˆλŠ” 후보일 뿐이닀. μ½”ν‹€λ¦°μ—μ„œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“œλ €λ©΄ SAM Conversionsλ₯Ό ν•΄μ•Ό ν•œλ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보자.

 

#2 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface, Single Abstract Method Interface, SAM)

fun interface MyFunctionalInterface {
    fun myMethod(value1: Int, value2: Int): Int
}

interface ν‚€μ›Œλ“œ μ•žμ— fun을 λΆ™μ˜€λ‹€. μ΄λŠ” μ½”ν‹€λ¦° μ»΄νŒŒμΌλŸ¬μ—κ²Œ 이 μΈν„°νŽ˜μ΄μŠ€κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μž„μ„ λͺ…μ‹œμ μœΌλ‘œ μ•Œλ¦¬λŠ” 행동이닀. 이 κ°„λ‹¨ν•œ 행동을 SAM Conversions라고 ν•œλ‹€. 말 κ·ΈλŒ€λ‘œ ν•¨μˆ˜ν˜•(fun) μΈν„°νŽ˜μ΄μŠ€(interface)κ°€ 된 것이닀. μ΄μ œλΆ€ν„° λΉ„λ‘œμ†Œ Kotlin은 ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ μΈμ‹ν•œλ‹€. (λ‹Ήμ—°ν•˜κ² μ§€λ§Œ, fun interface에 좔상 λ©”μ†Œλ“œλ₯Ό 2개 이상 λ„£μœΌλ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.)

 

Java에선 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μΈμ‹ν–ˆλ‹€. 즉, μ½”ν‹€λ¦°μ—μ„œμ²˜λŸΌ fun ν‚€μ›Œλ“œλ₯Ό λΆ™μ΄κ±°λ‚˜ ν•˜λŠ” μž‘μ—…μ΄ μ—†μ—ˆλ‹€. 반면, Javaλ₯Ό κ³„μŠΉν•œ Kotlin에선 일반 μΈν„°νŽ˜μ΄μŠ€μ™€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ κ΅¬λΆ„μ§“λŠ”λ‹€. κ·Έ ꡬ뢄을 톡해 ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ λͺ…μ‹œμ„±κ³Ό μ•ˆμ „μ„±μ„ μ œκ³΅ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

 

#3 읡λͺ… 클래슀의 μΈμŠ€ν„΄μŠ€ λ§Œλ“€κΈ°

#3-1 일반 μΈν„°νŽ˜μ΄μŠ€

interface MyNormalInterface {
    fun myFirstMethod(value: Int): String
    fun mySecondMethod(value1: Int, value2: String): Int
}

fun main() {
    val instance = object : MyNormalInterface {
        override fun myFirstMethod(value: Int): String {
            return "아무말"
        }

        override fun mySecondMethod(value1: Int, value2: String): Int {
            println("value2λŠ” $value2")
            return value1 + 1
        }
    }
}

μƒμš©κ΅¬ μ½”λ“œ(Boilerplate code)κ°€ λ§Žμ•„ λ³΅μž‘ν•΄ 보인닀.

 

#3-2 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface, Single Abstract Method Interface)

fun interface MyFunctionalInterface {
    fun myMethod(value1: Int, value2: Int): Int
}

fun main() {
    val instance = object : MyFunctionalInterface {
        override fun myMethod(value1: Int, value2: Int): Int {
            return value1 * value2 + 1
        }
    }
}

이처럼 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ λ˜ν•œ 일반 μΈν„°νŽ˜μ΄μŠ€μ—μ„œμ™€ 같이 μƒμš©κ΅¬ μ½”λ“œλ‘œ λ²”λ²…(?)된 μ½”λ“œλ₯Ό 지 수 μžˆλ‹€. ν•˜μ§€λ§Œ, ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 선택지가 ν•˜λ‚˜ 더 μžˆλ‹€.

 

fun interface MyFunctionalInterface {
    fun myMethod(value1: Int, value2: Int): Int
}

fun main() {
    val instance = MyFunctionalInterface { value1, value2 -> value1 * value2 + 1 }
}

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 이름 + λžŒλ‹€ ν‘œν˜„μ‹ 쑰합이면 λ°”λ‘œ 읡λͺ… 클래슀 생성과 μΈμŠ€ν„΄μŠ€ν™”κ°€ λ™μ‹œμ—, κ°„νŽΈν•˜κ²Œ 이뀄진닀. μ–΄μ°¨ν”Ό ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€κ°€ 가진 κ΅¬ν˜„ κ°€λŠ₯ν•œ λ©”μ†Œλ“œλŠ” 단 ν•œ κ°œλΏμ΄λΌλŠ” λΆ„λͺ…ν•œ 사싀이 μžˆκΈ°μ— κ°€λŠ₯ν•œ κ³Όκ°ν•œ 문법이닀.

 

#4 μš”μ•½

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ 단 ν•œ 개의 λ©”μ†Œλ“œλ₯Ό κ°€μ§„λ‹€λŠ” 사싀을 μ΄μš©ν•΄, μƒμš©κ΅¬ μ½”λ“œλ₯Ό μ œκ±°ν•œλ‹€.