프로그래밍 언어/Kotlin

[Kotlin] 6. 코틀린 확장 함수와 표준 라이브러리 활용

커피와 개발자 2024. 11. 23. 16:30
728x90
반응형

1. 확장 함수(Extension Function)

확장 함수는 기존 클래스에 새로운 함수나 속성을 추가하는 방법입니다. 클래스 코드를 수정하지 않고도 메서드를 추가할 수 있어 매우 유용합니다.

(1) 확장 함수 정의

fun String.addExclamation(): String {
    return this + "!"
}

val greeting = "Hello"
println(greeting.addExclamation()) // "Hello!"

  • this는 확장 함수가 호출되는 객체를 나타냅니다.
  • 확장 함수는 기존 클래스의 멤버처럼 사용할 수 있습니다.

(2) 확장 함수 활용

문자열의 확장 함수

fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

val email = "example@gmail.com"
println(email.isEmail()) // true

리스트의 확장 함수

fun List<Int>.sumOfSquares(): Int {
    return this.map { it * it }.sum()
}

val numbers = listOf(1, 2, 3)
println(numbers.sumOfSquares()) // 14 (1² + 2² + 3²)

 


2. 확장 속성(Extension Property)

확장 속성을 사용하면 클래스에 속성을 추가할 수 있습니다.

val String.firstChar: Char
    get() = this[0]

val word = "Kotlin"
println(word.firstChar) // 'K'


3. 표준 라이브러리 활용

코틀린은 많은 유용한 표준 라이브러리 함수들을 제공합니다. 대표적인 함수 몇 가지를 살펴보겠습니다.

(1) let

let은 특정 객체를 임시로 사용할 때 유용합니다.

val name: String? = "Alice"
name?.let {
    println("Name is $it")
} // "Name is Alice"

(2) run

run은 블록 내부에서 객체를 처리한 결과를 반환합니다.

val result = "Kotlin".run {
    println("String length: ${this.length}")
    this.uppercase() // 반환값
}
println(result) // "KOTLIN"

(3) apply

apply는 객체 설정에 사용됩니다. 반환값은 객체 자체입니다.

val person = Person().apply {
    name = "Bob"
    age = 25
}
println(person.name) // "Bob"

(4) also

also는 객체를 설정하면서 디버깅하거나 부가 작업을 할 때 유용합니다.

val numbers = mutableListOf(1, 2, 3).also {
    println("Original list: $it")
    it.add(4)
}
println(numbers) // [1, 2, 3, 4]

(5) with

with는 객체를 컨텍스트로 사용하여 여러 작업을 수행합니다.

val builder = StringBuilder()
with(builder) {
    append("Hello, ")
    append("Kotlin!")
}
println(builder.toString()) // "Hello, Kotlin!"

 


4. 예제: 확장 함수와 표준 라이브러리 결합

fun String.maskEmail(): String {
    val parts = this.split("@")
    return if (parts.size == 2) {
        parts[0].replace(Regex("."), "*") + "@" + parts[1]
    } else this
}

fun main() {
    val email = "example@gmail.com"
    val maskedEmail = email.maskEmail()
    maskedEmail.let {
        println("Masked email: $it")
    }
}


5. 확장 함수의 한계

  • 확장 함수는 클래스 내부의 private 또는 protected 멤버에 접근할 수 없습니다.
  • 멤버 함수와 이름이 같은 확장 함수가 있을 경우, 멤버 함수가 우선 호출됩니다.
728x90
반응형