Kotlin
[Kotlin] 10.1 다른 함수를 인자로 받거나 반환하는 함수 정의: 고차 함수
mygomii
2025. 5. 19. 09:00
반응형
- 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현 할 수 있음
10.1.1 함수 타입은 람다의 파라미터 타입과 반환 타입을 지정한다.
- 함수를 인자로 받거나, 함수를 반환하는 함수를 고차 함수라고 함
- 코틀린에서는 람다식이나 함수 참조를 통해 함수를 값처럼 사용할 수 있음
- 람다의 매개변수 타입과 반환 타입을 명시하여 사용.
val sum: (Int, Int) -> Int = { x, y -> x + y }
10.1.2 인자로 전달 받은 함수 호출
- 고차 함수에서 함수를 인자로 전달받았다면, 해당 함수를 일반 함수처럼 호출하면 됨
- 전달받은 함수도 ()를 붙여 호출할 수 있음
fun twoAndThree(operation: (Int, Int) -> Int): Int {
return operation(2, 3)
}
val sum = twoAndThree { a, b -> a + b } // 5
val product = twoAndThree { a, b -> a * b } // 6
- operation이라는 파라미터는 (Int, Int) -> Int 타입의 함수
- operation(2, 3)처럼 일반 함수처럼 호출 가능
10.1.3 자바에서 코틀린 함수 타입 사용
- 코틀린의 함수 타입은 Java의 함수형 인터페이스와 호환됨.
- Java에서는 코틀린 함수 타입을 직접 사용할 수는 없지만, Function 인터페이스나 람다로 전달 가능함.
// kotlin
fun process(operation: (Int, Int) -> Int): Int {
return operation(4, 2)
}
//java
int result = KotlinKt.process((a, b) -> a + b);
- SAM 변환 (Single Abstract Method)
- 자바에서는 함수형 인터페이스(메서드가 하나인 인터페이스)를 사용하여 코틀린 함수 타입을 전달받을 수 있음
- 자바의 람다는 이런 인터페이스를 구현한 익명 객체로 자동 변환됨 → SAM 변환
// kotlin
fun interface IntBinaryOp {
fun apply(x: Int, y: Int): Int
}
fun compute(op: IntBinaryOp): Int = op.apply(10, 5)
// java
int result = KotlinKt.compute((x, y) -> x * y);
10.1.4 함수 타입의 파라미터에 대해 기본값을 지정할 수 있고, 널이 될 수도 있다.
- 함수 타입 파라미터도 기본값 지정 가능
- 일반 파라미터처럼 함수 타입 파라미터에도 기본값을 설정할 수 있음
- 함수 인자를 생략하면 기본으로 지정된 함수가 사용됨
fun greet(message: String, formatter: (String) -> String = { it.uppercase() }) {
println(formatter(message))
}
greet("hello") // HELLO (기본값 사용)
greet("hello") { it.reversed() } // olleh
- 함수 타입 파라미터도 nullable 가능
- 함수 타입 파라미터에 null을 허용할 수도 있음.
- 이 경우에는 null 체크 후 호출 필요
fun greetNullable(message: String, formatter: ((String) -> String)? = null) {
val result = formatter?.invoke(message) ?: message
println(result)
}
greetNullable("hello") // hello
greetNullable("hello") { it.capitalize() } // Hello
10.1.5 함수를 함수에서 반환
- 코틀린에서는 함수를 반환값으로 사용할 수 있음
- 즉, 고차 함수는 함수를 반환할 수도 있음
- 반환 타입은 (파라미터) -> 반환값 형태의 함수 타입
fun operation(): (Int) -> Int {
return { it * 2 }
}
val result = operation()(3) // 6
- operation()은 (Int) -> Int 타입의 함수를 반환
- 반환된 함수를 즉시 호출: operation()(3)
10.1.6 람다를 활용해 중복을 줄여 코드 재사용성 높이기
- *공통된 코드 흐름(템플릿)*은 유지하고, 다른 동작만 람다로 전달하여 중복 제거
- 템플릿 메서드 패턴을 람다로 간결하게 구현하는 방식
fun <T> withFileReader(file: File, block: (BufferedReader) -> T): T {
return file.bufferedReader().use { reader ->
block(reader)
}
}
- file.bufferedReader()와 use {}는 공통 로직
- 실제 동작은 block 람다로 전달 받음
val lines = withFileReader(File("data.txt")) { reader ->
reader.readLines()
}
val firstLine = withFileReader(File("data.txt")) { reader ->
reader.readLine()
}
반응형