ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 19강. 코틀린의 이모저모
    BackEnd/Kotlin 2024. 5. 1. 07:30
    반응형
    1. Type Alias와 as import
    2. 구조분해와 componentN 함수
    3. Jump와 Label
    4. TakeIf와 TakeUnless

     

    Type Alias와 as import

      Type Alias는 긴 이름의 클래스 혹은 함수 타입이 있을 때 축약하거나 더 좋은 이름을 쓰고 싶을 때 사용합니다.

    // 함수
    typealias FruitFilter = (Fruit) -> Boolean
    
    fun filterFruits(fruits: List<Fruit>, filter: FruitFilter) {
    
    }
    
    // 클래스
    data class UltraSuperGuardianTribe(
        val name: String
    )
    
    typealias  USGTMap = Map<String, UltraSuperGuardianTribe>

     

      as import는 어떤 클래스나 함수를 임포트 할 때 이름을 바꾸는 기능입니다. 다음과 같이 서로 다른 패키지에 동일한 함수가 존재할 수 있습니다. main 파일에서 a, b 패키지에 있는 printHelloWorld를 사용하기 위해 as import를 사용합니다.

    import com.lannstark.lec19.a.printHelloWorld as printHelloWorldA
    import com.lannstark.lec19.b.printHelloWorld as printHelloWorldB
    
    fun main() {
        printHelloWorldA()
        printHelloWorldB()
    }

     

    구조분해와 componentN 함수

      구조분해란 복합적인 값을 분해하여 여러 변수를 한 번에 초기화하는 것입니다. 다음은 data class Person을 구조분해하여 name, age 변수에 한 번에 초기화하는 코드입니다.

    data class Person(
        val name: String,
        val age: Int
    )
    
    fun main() {
        val person = Person("Kotlin", 100)
        val (name, age) = person
        println("name: ${name}, age: ${age}")
    }

     

      구조분해가 가능한 이유는 data class가 기본적으로 componentN이란 함수를 자동으로 만들어 주기 때문입니다. 즉, 구조분해 문법을 사용한다는 것은 componentN 함수를 호출한다는 것입니다. component 뒤의 N은 숫자를 의미하며 프로퍼티의 순서입니다.

    fun main() {
        val person = Person("Kotlin", 100)
    //    val (name, age) = person
        val name = person.component1()
        val age = person.component2()
        println("name: ${name}, age: ${age}")
    }

     

      data class가 아닌데 구조분해를 사용하고 싶다면, componentN 함수를 직접 구현해 주어야 합니다.

    class Person2(
        val name: String,
        val age: Int
    ) {
        operator fun component1(): String {
            return this.name
        }
    
        operator fun component2(): Int {
            return this.age
        }
    }
    
    fun main() {
        val person2 = Person2("Kotlin", 100)
        val (name2, age2) = person2
        println("name: ${name2}, age: ${age2}")
    }

     

    Jump와 Label

      Kotlin에는 다음과 같이 Label(Label명@)을 달 수 있는 기능과 return, continue, break에 대해 특정 Label에 대해 동작할 수 있게 하는 기능이 존재합니다. 다만 Label을 사용한 Jump는 복잡도가 향상되기에 사용하지 않는 것이 좋습니다.

        loop@ for (i in 1..100) {
            for (j in 1..100) {
                if (j == 2) {
                    break@loop
                }
                print("${i} ${j}")
            }
        }

     

    TakeIf와 TakeUnless

      TakeIf는 주어진 조건을 만족하면 그 값이, 그렇지 않으면 null을 반환합니다.

    fun getNumberOrNull(number: Int): Int? {
        return number.takeIf { it > 0 }
    }

     

      반대로 TakeUnless는 주어진 조건을 만족하지 않으면 그 값이, 그렇지 않으면 null을 반환합니다.

    fun getNullOrNumber(number: Int): Int? {
        return number.takeUnless { it <= 0 }
    }
    반응형

    댓글

Designed by Tistory.