-
19강. 코틀린의 이모저모BackEnd/Kotlin 2024. 5. 1. 07:30반응형
- Type Alias와 as import
- 구조분해와 componentN 함수
- Jump와 Label
- 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 } }
반응형'BackEnd > Kotlin' 카테고리의 다른 글
20강. 코틀린의 scope function (0) 2024.05.23 18강. 코틀린에서 컬렉션을 함수형으로 다루는 방법 (0) 2024.04.14 17강. 코틀린에서 람다를 다루는 방법 (1) 2024.04.07 16강. 코틀린에서 다양한 함수를 다루는 방법 (0) 2024.04.06 15강. 코틀린에서 배열과 컬렉션을 다루는 방법 (0) 2024.03.21