•
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 등의 컬렉션에 담긴 데이터를 바로 분해해서 활용하여 가독성 향상