Kotlin - Other Features

2023. 4. 30. 04:13·📘 Backend/Kotlin
목차
  1. 💡 코틀린 - 그 외 다양한 기능들
  2. Type Alias & as import
  3. 구조분해와 componentN 함수
  4. componentN 함수란?
  5. Data Class가 아닌 Class 에서 ComponentN 함수 구현
  6. Jump & Label
  7. Jump
  8. Label
  9. TakeIf & TakeUnless

💡 코틀린 - 그 외 다양한 기능들

목차

  • Type Alias & as import
  • 구조분해와 componentN 함수
  • Jump & Label
  • TakeIf & TakeUnless

Type Alias & as import

긴 이름의 클래스 & 함수 타입이 있을때 축약하거나 더 좋은 이름을 쓰고 싶을 때 사용한다.

  • type alias : 타입이나 클래스 이름에 별칭을 붙여 줄여서 사용 가능하다.
  • as import : 어떤 클래스나 함수를 import 할 때 이름을 바꾸는 기능이다.

이 함수에서 파라미터로 받는 filter 부분이 길다고 느껴질 수 있다.

그리고 filter 함수의 파라미터가 많아진다면 더 길 것이다.

fun filterFruits(fruits: List<Fruit>, filter: (Fruit) -> Boolean ) {}

이럴때 typealias 키워드를 사용해 타입의 별칭을 지정하는게 가능하다.

typealias FruitFilter = (Fruit) -> Boolean

fun filterFruits(fruits: List<Fruit>, filter: FruitFilter ) {}

이름이 킨 클래스 컬렉션에 사용할 때도 간단히 줄일 수 있다.

data class UltraSuperGuardianTribe(
    val name: String
)

typealias USGTMap = Map<String, UltraSuperGuardianTribe>

다른 패키지의 같은 이름 함수를 동시에 가져오고 싶다면 as를 사용한다.

package com.a

fun printHelloWorld() {
    println("Hello World A")
}

// ----- //

package com.b
fun printHelloWorld() {
    println("Hello World B")
}

// ----- //
import com.a.printHelloWorld as printA
import com.b.printHelloWorld as printB

fun main() {
    printA()
    printB()
}

구조분해와 componentN 함수

구조분해란?

  • 복합적인 값을 분해하여 여러 변수를 한 번에 초기화하는 것이다.
  • 구조분해 문법을 쓴다는 것은 componentN 함수를 사용한다는 소리와 마찬가지이다.
  • 아래 예시를 보자.
  • person 객체에 대한 초기화를 한번에 하고있고, 내부적으로 componentN 함수가 호출이 된 것이다.
data class Person(
    val name: String,
    val age: Int
)

fun main() {
    val person = Person("사람", 20)
    val (name, age) = Person
    println("이름 : $name, 나이 : $age")
}

data class를 만들면 기본적으로 componentN 함수를 만들어준다.


componentN 함수란?

  • 데이터 클래스는 기본적으로 자기 자신의 필드에 대한 componentN 함수를 만든다.

이게 무슨 말이냐면 위의 코드의 val (name, age) 부븐을 코드로 변환하면
내부적으로 이런 형태로 호출이 된다.

val name = person.component1()
val age = person.component2()

Data Class가 아닌 Class 에서 ComponentN 함수 구현

data class는 기본적으로 componentN 함수를 만든다고 했는데 data class가 아니면 어떻게 해야 할까?

  • 클래스의 body에 componentN 함수를 직접 구현하면 된다.
  • componentN 함수는 연산자의 속성을 가지므로 연산자 오버로딩 형식으로 구현해야 한다. (operator 키워드)
class Person(
    val name: String,
    val age: Int
) {

    operator fun component1(): String {
        return this.name
    }

    operator fun component2(): Int {
        return this.age
    }
}

리스트를 인덱스와 함께 사용할때와 Map의 entries 함수도 사실 구조분해 문법을 사용한다.

val map = mapOf(1 to "A", 2 to "B")

for ((key, value) in map.entries) {}

Jump & Label

Jump

return : 기본적으로 가장 가까운 Enclosing Function 또는 익명함수로 값이 반환된다.

break : 가장 가까운 Loop가 제거된다.

continue : 가장 가까운 Loop를 다음 Step 으로 보낸다.

위의 기능들은 기본적으로 자바와 100% 동일하다.

하지만, For-Each에서 코틀린과 자바에 차이가 있다.

코틀린의 forEach()에서는 continue나 break를 사용할 수 없다.

fun main() {
    val numbers = listOf(1, 2, 3)

    numbers.map{it + 1}.forEach{println(it)}

    for (num in)
}

forEach에서 break를 쓰고 싶을 경우 run 키워드를 사용해서 return@run 키워드를 사용해야 한다.

fun main() {
    run {
        numbers.forEach {
            number ->
            if (number == 3) {
                return@run
            }
            println(number)
        }
    }
}

forEach에서 continue를 쓰고 싶을 경우 return@forEach를 사용해야 한다.

numbers.forEach {
    number ->
    if (number == 2) {
        return@forEach
    }
}

Label

특정 Expression에 라벨이름@을 붙여 하나의 라벨로 간주하고 break, continew, return 등을 사용하는 기능

Label을 사용한 Jump는 가급적 사용하지 않는게 좋다.

왜냐하면 코드의 흐름이 위아래로 계속 움직일수록 시간복잡도가 기하급수적으로 증가한다.

  • 첫 for 문에 라벨을 붙이고 안쪽 조건문에 부합하면 라벨이 붙은 for문에 break가 걸린다.
loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (j == 2) {
            break@loop
        }
        println("${i}, ${j}")
    }
}

TakeIf & TakeUnless

코틀린은 Method Chaining을 위한 특이한 함수인 takeIf, takeUnless를 제공한다.

fun getNumberOrNull(): Int? {
    return if (number <= 0) null else number
}

코틀린은 Method Chaining을 위한 특이한 함수를 제공한다. (takeIf)

위의 코드를 리팩터링 해보자.

takeIf를 사용하면 조건을 만족하면 그 값이, 아니면 Null을 반환하는 기능을 한다.

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

그리고, 주어진 조건을 만족하지 않으면 그 값이, 아니면 Null이 반환되는 takeUnless 기능이 있다.

fun getNumberOrNullV3(): Int? {
    return number.takeUnless { it <= 0 }
}
저작자표시 (새창열림)

'📘 Backend > Kotlin' 카테고리의 다른 글

File Class  (0) 2023.04.30
File을 다루는 Class들  (0) 2023.04.30
Kotlin - Stream  (0) 2023.04.30
Kotlin - Lambda  (0) 2023.04.29
Kotlin - More Functions  (0) 2023.04.27
  1. 💡 코틀린 - 그 외 다양한 기능들
  2. Type Alias & as import
  3. 구조분해와 componentN 함수
  4. componentN 함수란?
  5. Data Class가 아닌 Class 에서 ComponentN 함수 구현
  6. Jump & Label
  7. Jump
  8. Label
  9. TakeIf & TakeUnless
'📘 Backend/Kotlin' 카테고리의 다른 글
  • File Class
  • File을 다루는 Class들
  • Kotlin - Stream
  • Kotlin - Lambda
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      React #Markdown
      GStreamer #Pipeline
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Kotlin - Other Features
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.