Backend
home

8. 함수 더 자세히

생성일
2025/02/01 15:55
태그
Kotlin
kotlin 에서는 다양한 콜렉션 기본 생성 함수 제공
내부적으로는 자바와의 호환을 위해 java의 콜렉션을 사용함
코틀린 라이브러리에서 추가 기능들을 제공
val set: Set<Int> = setOf(1, 2, 3) val list = listOf("a", "b", "1L") val map = mapOf( 1 to "One", 3 to "Three" ) fun main() { println(set.javaClass) println(list.javaClass) println(map.javaClass) }
Kotlin
복사

함수를 호출하기 쉽게 만들기

이름 붙인 인자
fun getMyName ( firstName: String, lastName: String ): String = "$firstName $lastName" fun main() { println(getMyName("Steve", "Jobs")) // 파라미터가 무엇인지 알 수 없어서 혼동이 될 수 있다(특히 파라미터가 많을 때) println(getMyName("Jobs", "Steve")) // 파라미터에 이름을 붙이면 명확하게 호출 가능 println(getMyName(firstName = "Steve", lastName = "Jobs")) }
Kotlin
복사
자바는 생성자 또는 메서드 호출 시 파라미터 순서를 확인해서 인자를 넘겨야 하는 불편이 있었음
코틀린은 생성자 또는 메서드 호출 시 파라미터의 이름을 붙여서 실수를 방지할 수 있음
디폴트 파라미터 값
fun getMyName ( firstName: String = "foo", lastName: String = "bar" ): String = "$firstName $lastName" fun main() { // 파라미터 없이 호출하면 기본 값으로 호출 println(getMyName()) // 파라미터를 적게 넣어서 호출하면 앞쪽부터 파라미터를 채우고 나머지는 기본 값 사용 println(getMyName(lastName = "Steve")) // 특정 파라미터를 이름 붙인 인자로 호출하면 해당 값만 수정해서 호출 println(getMyName(lastName = "Jobs")) } ===== 결과 ===== foo bar Steve bar foo Jobs
Kotlin
복사
자바에서는 파라미터가 일부만 달라도 오버로딩으로 여러 메서드를 만드는 케이스가 흔하고, 불편을 초래함
코틀린은 디폴트 파라미터를 활용해 하나의 메서드로 마치 여러 메서드 같은 효과를 낼 수 있음
최상위 함수와 프로퍼티
package com.zero.two const val ONE = 1 const val TWO = 2 fun sum(num1: Int, num2: Int) = num1 + num2
Kotlin
복사
코틀린은 변수나 함수가 클래스 내에 있지 않고 최상위에 있을 수 있음
자바의 유틸 클래스처럼 불필요한 클래스를 만들 필요가 없고 간결함
→ 자바 코드와 비교
package com.zero.two; public final class NumberUtils { public static final Integer ONE = 1; public static final Integer TWO = 2; private NumberUtils() { } public static Integer sum(Integer num1, Integer num2) { return num1 + num2; } }
Java
복사

확장함수(Extension function)와 확장 프로퍼티(Extension property)

확장함수
fun String.double(add:String) = this + this fun main() { println("do".double()) } ===== 결과 ===== dodo
Kotlin
복사
자바 또는 코틀린 등으로 만들어진 라이브러리의 클래스에 메서드를 추가하고 싶다면?
자바에서는 상속 후 확장할 수밖에 없었음
코틀린은 확장함수를 이용하면 손쉽게 추가
다만 확장함수는 오버라이드 할 수 없음
내부적으로 정적 메서드를 만들어서 제공하는 것이기 때문
확장 프로퍼티
val String.lastChar: Char get() = get(this.length - 1)
Kotlin
복사
기본적인 클래스의 프로퍼티와 유사한 문법이지만 프로퍼티 앞에 해당되는 클래스명을 붙여줘야 함
컬렉션의 추가 메서드들은 모두 확장함수
println(setOf(1, 23, 45, 3).maxOrNull()) println(listOf("ab", "bc", "cd").last())
Kotlin
복사
set, list에 대해 추가 함수를 확장함수를 통해 제공
가변 인자 함수
public fun <T> setOf(vararg elements: T): Set<T> public fun <T> listOf(vararg elements: T): List<T>
Kotlin
복사
vararg 키워드를 사용해서 가변적인 갯수의 인자 수신
중위 호출 (Infix function)
infix fun String.add(postfix: String) = this + postfix infix fun String.equalTo(expected: String) = this == expected fun main() { println("This is ".add("good")) println("This is " add "good") println("xyxy" equalTo "xyxy") }
Kotlin
복사
주로 확장함수이면서 파라미터가 한개인 함수에 활용 가능
가독성 향상과 코드 길이 축소
주로 mapOf(”key” to “value”, “k2” to “v2”) 에서 많이 활용
println(mapOf("key" to "value", "k2" to "v2")) println(mapOf("key".to("value"), "k2".to("v2"))) println(mapOf(Pair("key", "value"), Pair("k2", "v2"))) public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that) public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V>
Kotlin
복사
mapOf는 Pair를 가변인자로 받고 있으며, Pair 생성을 to infix 함수를 활용해서 진행
infix function도 일반 함수처럼 호출이 가능
구조 분해 선언(Destructuring declarations)
val person = Pair("Snow", true) val (name, isMarried) = person val persons = mapOf( "Snow" to true, "Peter" to false, "Paul" to true, ) // map iteration 시에 분해해서 접근 persons.forEach { (name, isMarried) -> println("$name is married($isMarried)") } // isMarried 미사용 persons.forEach { (name, _) -> println("$name is in this list") }
Kotlin
복사
주로 Pair 또는 Triple을 사용하는 경우 많이 사용함
map 또는 list 등의 컬렉션에 담긴 데이터를 바로 분해해서 활용하여 가독성 향상