ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] 확장함수와 확장속성
    코틀린 2022. 3. 20. 15:42

    1. 확장 함수

    코틀린은 클래스에 함수나 속성을 인젝팅 할 수 있다. 확장 함수와 확장 속성은 인젝팅 되는 클래스의 바이트코드는 변경하지 않으면서 메소드와 속성을 추가한다. 

    data class Book(
        val title: String,
        val author: String,
        val price: Int
    )
    
    fun Book.isWrittenBy(author: String): Boolean {
        return this.author == author
    }
    
    val b = Book("Kotlin book", "Park", 100)
    b.isWrittenBy("Park") // true

    위의 코드에서 isWrittenBy는 Book 클래스 밖에서 정의되었다. 하지만 마치 Book의 클래스 메소드처럼 동작한다.

    확장함수의 실제 동작은 패키지의 static 메소드로 만들어져 사용된다. 컴파일러는 확장 함수의 첫번째 인자로 확장된 클래스의 인스턴스를 던지고 확장함수는 그걸 받아서 처리한다. 확장함수는 두 가지 제약 사항이 있다.

    • 클래스의 private 멤버에 접근할 수 없음
    • 만약 클래스에 같은 이름의 메소드가 이미 있으면 확장 함수는 인젝팅 되지 않음

     

    2. 확장 속성

    확장 함수와 비슷한 방식으로 확장 속성 또한 추가할 수 있다. 아래는 클래스의 필드를 이용해서 displayName이라는 새로운 필드를 정의하는 예시이다.

    data class Book(
        val title: String,
        val author: String,
        val price: Int
    )
    
    val Book.displayName: String get() = "$title $author $price"
    b.displayName // 출력: Kotlin book Park 100

     

    3. 함수 확장

    코틀린에서는 함수를 확장할 수도 있다. 아래 예시에서는 코틀린 함수에 andThen 메소드를 인젝트해서 두 함수를 연결한 함수를 만들 수 있도록 하는 것을 보여준다.

    // 코틀린에서 정의되는 함수에 andThen 메소드를 추가함
    fun <T, R, U> ((T) -> R).andThen(next: (R) -> U): (T) -> U =
        { input: T -> next(this(input))}
    
    // 1 증가시키는 메소드와 2배로 만드는 메소드를 결합함
    fun incremental(input: Int): Int {
        return input + 1
    }
    
    fun double(input: Int): Int {
        return input * 2
    }
    
    val incrementalAndDouble = ::incremental.andThen(::double)
    println(incrementalAndDouble(0)) // 2

     

    '코틀린' 카테고리의 다른 글

    [코틀린] also, apply, let, run  (0) 2022.03.20
    [코틀린] 연산자 오버로딩  (0) 2022.03.20
    [코틀린] 내부 반복(map, filter, groupBy, reduce)  (0) 2022.03.19
    [코틀린] 람다  (0) 2022.03.19
    [코틀린] 델리게이션  (0) 2022.03.16

    댓글

Designed by Tistory.