[Kotlin] 3-2. 확장 함수 (extension function)

2022. 6. 3. 18:27·Kotlin/Kotlin In Action
728x90

∘ 기존 자바 API를 재작성하지 않고도 코틀린이 제공하는 편리한 기능을 사용할 수 있다??!!

∘ 확장함수는 이를 가능하게 한다.

 

ex) String 변수를 LocalDate 형식으로 변환하고 싶다.

 

// 확장함수를 쓰지 않으면
 fun main() {
    val str = "20220603"
    val localDate = getLocalDate(str)
    println(localDate) // 2022-06-03
}

fun getLocalDate(str: String): LocalDate {
    return LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyyMMdd"))
}

 

∘ 이렇게 매번 함수를 만들어서 사용하고 싶지 않다면

 

// 확장함수 사용
fun main() {
    val str = "20220603"
    val localDate = str.toLocalDate()
    println(localDate) // 2022-06-03
}

// String : 수신객체 타입
fun String.toLocalDate(): LocalDate {
    // this : 수신객체
    return LocalDate.parse(this, DateTimeFormatter.ofPattern("yyyyMMdd"))
}

 

∘ LocalDate 타입으로 변환해주는 String의 확장함수 toLocalDate()를 만들어놓고 사용하자!

 

∘ 확장 함수는 캡슐화를 깨지 않는다.

∘ 확장 함수 내에서는 private/protected 멤버를 사용할 수 없다.

∘ 확장 함수를 호출하는 쪽(예제의 main)에서는 확장함수와 멤버함수를 구분할 수 없고, 구분할 필요도 없다.


[ import & extension function ]



∘ extension function을 사용하려면 해당 함수가 정의된 클래스를 import 해야한다.

import strings.toLocalDate

import strings.*

import strings.toLocalDate as localdate

 


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

 

interface View {
    fun click() = println("View Clicked")
}

class Button: View {
    override fun click() {
        println("Button Clicked")
    }
}

fun main() {
    val button: View = Button()
    val button2 = Button()

    button.click() // Button Clicked
    button2.click() // Button Clicked
}

 

∘ Button class는 View 인터페이스를의 구현체이며 click()함수를 오버라이드 하고있다.

∘ button 변수는 실제 타입이 Button class이므로 오버라이드된 click함수가 호출된다.

 

하지만 확장함수에서는?

 

fun View.showOff() = println("I'm view!")
fun Button.showOff() = println("I'm button!!")

interface View

class Button: View

fun main() {
    val button: View = Button()
    val button2 = Button()

    button.showOff() // I'm view!
    button2.showOff() // I'm button!
}



∘ 확장 함수는 정적 자바 메소드로 컴파일하기 때문에 View 인터페이스의 button은 View의 확장함수인 View.showOff()가 호출된다.

 

728x90
저작자표시 (새창열림)

'Kotlin > Kotlin In Action' 카테고리의 다른 글

[Kotlin] 3-1. 함수의 정의와 호출  (0) 2022.06.03
[Kotlin] 2-5. 코틀린의 예외 처리  (0) 2022.05.15
[Kotlin] 2-4. 이터레이션: while & for  (0) 2022.05.15
[Kotlin] 2-3. 선택 표현과 처리 : enum과 when  (0) 2022.05.15
[Kotlin] 2-2. 클래스와 프로퍼티  (0) 2022.04.03
'Kotlin/Kotlin In Action' 카테고리의 다른 글
  • [Kotlin] 3-1. 함수의 정의와 호출
  • [Kotlin] 2-5. 코틀린의 예외 처리
  • [Kotlin] 2-4. 이터레이션: while & for
  • [Kotlin] 2-3. 선택 표현과 처리 : enum과 when
gudwnsgur
gudwnsgur
IT
    250x250
  • gudwnsgur
    gudwnsgur
    gudwnsgur
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 개발이야기
      • Spring
        • 이슈 해결
      • JPA
        • spring data jpa
      • Java
        • Java의 정석
      • Kotlin
        • Kotlin In Action
        • Kotlin 정리
      • 대규모 시스템 설계 기초
      • JavaScript
        • JS ES6+
      • 면접
        • CS
      • SQLD
      • BE 개발
        • spring webflux
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    HTTP
    대규모 시스템 설계 기초
    session
    cookie
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gudwnsgur
[Kotlin] 3-2. 확장 함수 (extension function)
상단으로

티스토리툴바