devlog of ShinJe Kim

[TIL] 2019-08-22 (목)

|

Today I Learned

Kotlin in Action 3장

3.1 코틀린에서 컬렉션 만들기

  • 코틀린은 자바와의 호환성을 위해 자체 컬렉션 기능을 제공하지 않고 기존의 자바 컬렉션을 활용한다. 또한 자바에서 쓸 수 있는 기능보다 더 많은 기능을 제공한다.

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

  • 코틀린으로 작성한 함수를 호출할 때는 함수에 전달하는 인자 중 일부 혹은 전부의 이름을 명시할 수 있다. 이 때 혼동되는 상황을 방지하기 위해 인자 이름을 하나라도 명시했다면, 다른 인자들의 이름도 꼭 명시해야 한다.
// 기존의 자바 스타일
joinToString(Collection, " ", " ", ".")
// 코틀린
joinToString(collection, separator = " ", prefix = " ", postfix = ".")

3.2.2 디폴트 파라미터 값

코틀린에서는 아래와 같이 디폴트 파라미터 값을 지정할 수 있다. 디폴트 값을 지정하면 함수를 호출할 때 일부를 생략하여 사용할 수도 있다.

fun <T> joinToString(
    collection: Collection<T>,
    separator: String = ", ",
    prefix: String = "",
    postfix: String = ""
): String

3.2.3 정적인 유틸리티 클래스 없애기: 최상위 함수와 프로퍼티

자바에서는 클래스 안에서만 함수 정의가 가능했다. 하지만 코틀린에서는 함수를 최상위에 정의할 수 있다. 이는 JVM이 코틀린을 컴파일 할 때 함수에 대응하는 클래스가 없다면 새로운 클래스를 정의해주기 때문이다. 이 때 코틀린 컴파일러가 생성하는 클래스의 이름은 최상위 함수가 들어있는 코틀린 소스 파일의 이름과 같다. 만약 이 클래스의 이름을 변경하고 싶다면 파일 최상단에 file@JvmName("원하는 클래스 이름") 를 추가하면 된다

3.3 메소드를 다른 클래스에 추가: 확장 함수와 확장 프로퍼티

확장 함수(extension function)란 클래스의 멤버 메소드처럼 호출할 수 있지만 클래스 밖에서 정의된 함수를 의미한다. 기존의 자바 코드를 유지하면서 코틀린을 사용할 수 있도록 해주는 기능이다. 확장 함수를 가져다 쓰는 것을 ‘수신’이라고 표현한다. 확장 함수를 수신하더라도 캡슐화는 유지되어서 접근지정자가 private이나 protected인 멤버는 사용할 수 없다. 수신하는 방법은 아래와 같다.

fun String.lastChar(): Char = this.get(this.length-1)

위의 코드를 찬찬히 살펴보면, String: 수신 객체 타입(receiver type)을 의미한다. 확장 함수가 정의될 타임이다. lastChar(): 확장 함수이다. this: 수신 객체(receiver object) 이다. 수신되는 클래스의 인스턴스 객체를 의미한다.

이렇게 수신하고 나면 다른 함수와 동일한 방법으로 사용할 수 있다.

3.3.1 임포트와 확장 함수 확장 함수를 쓸 때에는 같은 이름의 다른 함수와의 충돌을 방지하기 위해 다른 함수처럼 import를 해야 한다. 임포트 방식은 기존의 클래스 임포트 방식과 동일하며, as를 사용하면 원하는 이름으로 함수를 임포트할 수 있다.

// 아래의 방식 모두 사용 가능하다.
1. import strings.lastChar
2. import strings.*
3. import strings.lastChar as last

Comments