Action Kotlin 2 - 함수의 정의와 호출

Kotlin에서 Collection

Kotlin에서의 Collection은 자체적인 컬렉션 기능이 없다.
기존 Java의 컬렉션을 그대로 가져간다.

하지만, 기존의 Java의 컬렉션에 없는 기능을 제공한다.

예를들어, 마지막 원소 또는 첫번째 원소를 가져오고 싶다면 다음과 같이 작성이 가능하다.

val strings = listOf("first","second","third")
strings.last()
strings.first()

메서드를 다른 클래스에 추가 : 확장 함수

확장함수란 ?

어떤 클래스의 멤버 메서드인 것처럼 호출될 수 잇지만, 그 클래스 밖에 선언된 함수이다.

말로만 들으면 애매할 수 있으니, String의 마지막 문자를 가져오는 함수를 작성해보겠다.

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

확장 함수를 만들기 위해서는 수신 객체 타입 뒤에 확장할 클래스 이름만 덧붙이면 된다.

위의 함수에서 String수신 객체 타입 이며, this수신 객체이다.

println("Kotlin".lastChar())

다음을 출력하면, n이 출력이 된다. 여기서 수신 객체는 Kotlin이다.

확장 함수는 캡슐화를 깨는 것이 아닌가?

확장 함수는 캡슐화를 깨지 않는다. 확장 함수는 클래스 내부의 정의된 private멤버나 protected멤버를 사용할 수 없다.

확장 함수는 오버라이드 할 수 없다.

확장 함수는 오버라이드 할 수 없다.
확장 함수는 클래스 내부에 선언된 것이 아니라, 외부에 선언된 것이다.
확장 함수는 정적으로 결정되기 때문에 오버라이드 할 수 없다.

확장 프로퍼티

확장 프로퍼티를 사용하면, 기존 클래스 객체에 대한 프로퍼티 형식의 구문으로 사용할 수 있는 API를 추가할 수 있다.

위에서 작성한 lastChar함수를 확장 프로퍼티로 선언하면, 다음과 같이 선언할 수 있다.

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

만약 StringBuilder를 사용한다면 마지막 문자를 변경 가능하므로 변경 가능한 확장 프로퍼티를 만들 수 있다.

val StringBuilder.lastChar : Char
    get() = get(length - 1)
    set(value : Char) {
        this.setCharAt(length - 1, value)
    }

사용 하는 방법은 멤버 프로퍼티를 사용하는 것과 동일하다.

>>> println("Kotlin".lastChar)
n
>>> val sb = StringBuilder("Kotlin~")
>>> sb.lastChar = '!'
>>> println(sb)
Kotlin!