컬렉션
- 코틀린은 자체 컬렉션을 제공안함. 표준 자바 컬렉션을 활용하면 자바 코드와 상호작용하기가 더 쉬움.
val foo = listOf("a", "b", "c")
val last = foo.last()
// c
val numbers = setOf(1,2,3)
val maxNumber = numbers.max()
// 3
함수 호출하기 쉽게 개선하기
fun <T> joinToString(
collection: Collection<T>,
seperator: String,
prefix: String,
postfix: String
) : String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0) result.append(seperator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
fun main() {
val list = listOf(10,20,30)
println(joinToString(list, " ", "/", "/"))
// /10 20 30/
}
리펙터링
- 코틀린에서 가독성을 위해 이름을 붙인 인자를 넣어줄 수 있다.
fun main() { val list = listOf(10,20,30) println(joinToString(list, separator = " ", prefix = "/", postfix = "/")) }
- 코틀린에서 디폴트 파라미터를 사용하면 Java에서 읽을때는 디폴트 파라미터 개념이 없어 오버라이딩 함수로 번역된다.
확장함수로 리펙토링
fun <T> Collection<T>.joinToString(
collection: Collection<T>,
seperator: String = ", ",
prefix: String = "",
postfix: String = ""
) : String {
val result = StringBuilder(prefix)
// this는 수신객체를 가리킴.
for ((index, element) in this.withIndex()) {
if (index > 0) result.append(seperator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
확장함수
- 확장함수는 오버라이드 할 수 없다. 수신 객체로 지정한 변수의 정적 타입에 의해 어떤 확장 함수가 호출될지 결정됨.
- 확장 함수와 클래스의 멤버 함수와 이름 시그니쳐가 같으면 맴버함수가 우선 호출 된다.
가변인자
fun foo(vararg bar: String) {
println(bar.joinToString(","))
}
fun main() {
val strings = arrayOf("b", "c", "d")
foo(*strings)
}
to 함수
정규식
- split(".")를 하면 모든 문자를 나타내는 정규식으로 해석
- 구분 값으로 사용하기 위해서는 이스케이프로 정규식임을 나타내야한다.
fun main() {
println("1.2.3".split("\\.|-".toRegex()))
}
3중 따옴표
로컬함수
- 로컬 함수를 이용하여 내부 검증 로직을 사용하거나 확장함수로 클래스를 간결하게 유지하게 만들 수 있다.
- 중첩된 함수 깊이가 깊어지면 코드 읽기가 어려워지기 떄문에 한 단계만 권장한다.