코틀린에서 패턴 매칭을 사용하는 방법은?
_____A1: 코틀린에서 패턴 매칭은 주로 `when` 표현식을 사용하여 변수의 값이나 타입에 따라 분기 처리를 하는 것을 의미합니다. 여러 조건을 간결하게 검사하고 해당 조건에 맞는 코드를 실행할 수 있게 해 줍니다.
---
Q2: 코틀린에서 `when` 표현식은 어떻게 사용하나요?
A2: 기본 구조는 다음과 같습니다.
```kotlin
when (value) {
pattern1 -> action1
pattern2 -> action2
else -> defaultAction
}
```
`value`의 값이 `pattern1`과 같으면 `action1`이 실행되고, 그렇지 않으면 다음 패턴을 검사합니다. 모든 패턴에 맞지 않으면 `else` 블록이 실행됩니다.
---
Q3: 코틀린의 `when`에서 패턴으로 어떤 것들이 가능한가요?
A3: 다음과 같은 패턴을 사용할 수 있습니다.
- 값 단순 비교: 리터럴 값이나 변수와 비교 가능
- 여러 값을 콤마로 나열하여 매칭: `1, 2, 3 -> ...`
- 조건 검사 (분기 조건): `in range`, `!in range` 등
- 함수 호출 결과에 따른 분기
- 타입 체크: `is Type` 또는 `!is Type`
- 범위 검사, 컬렉션 포함 여부 검사 등 다양하게 활용 가능
---
Q4: `when`으로 타입 패턴 매칭 예제를 보여주세요.
A4:
```kotlin
fun describe(obj: Any): String {
return when (obj) {
is String -> "String of length ${obj.length}"
is Int -> "Int value ${obj}"
else -> "Unknown type"
}
}
```
이 코드는 객체의 타입에 따라 다른 문자열을 반환합니다.
---
Q5: `when`에서 패턴 매칭 없이도 사용 가능한가요?
A5: 네, `when`은 매개변수가 없는 형태도 가능하며, 복잡한 조건문을 `if-else` 대신 깔끔하게 표현할 수 있습니다.
```kotlin
when {
x.isEmpty() -> println("Empty")
x.length > 5 -> println("Long string")
else -> println("Other")
}
```
Q6: 코틀린의 `sealed class`와 패턴 매칭은 어떻게 연결되나요?
A6: `sealed class`는 제한된 클래스 계층 구조를 지원해 `when`에서 모든 하위 타입을 커버하도록 강제할 수 있습니다. 이렇게 하면 else 분기가 필요 없고, 패턴 매칭이 더욱 안전해집니다.
```kotlin
sealed class Expr
class Num(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
fun eval(e: Expr): Int = when(e) {
is Num -> e.value
is Sum -> eval(e.left) + eval(e.right)
// else 없음, 모든 타입을 커버
}
```
---
Q7: 코틀린에서 정규식 패턴 매칭을 할 수 있나요?
A7: 직접 `when`의 패턴으로 사용할 수는 없지만, `when` 조건에서 `Regex.matches()`를 호출하는 방식으로 정규식 매칭을 구현할 수 있습니다.
```kotlin
when {
Regex("^[a-z]+$").matches(input) -> println("Lowercase only")
Regex("^[0-9]+$").matches(input) -> println("Digits only")
else -> println("Other pattern")
}
```
---
Q8: 여러 조건을 동시에 만족해야 할 때 코틀린 `when`에서 어떻게 처리하나요?
A8: `when`은 각 분기에서 하나의 조건만 검사하지만, 조건식을 조합해서 복잡한 패턴을 표현할 수 있습니다.
```kotlin
when {
x is String && x.startsWith("K") -> println("String starts with K")
x is Int || x == null -> println("Int or null")
else -> println("Other")
}
```
---
Q9: 코틀린에서 `when` 표현식을 값으로 사용할 수 있나요?
A9: 네, `when`은 표현식이므로 결과 값을 바로 변수에 할당할 수 있습니다.
```kotlin
val result = when(val code = getCode()) {
200 -> "OK"
404 -> "Not Found"
else -> "Unknown"
}
```
---
요약: 코틀린에서 패턴 매칭은 주로 `when` 표현식을 통해 구현하며, 값 비교, 타입 체크, 범위 검사, 조건문 형태로 다양하게 활용할 수 있습니다. `sealed class`와 함께 사용하면 더욱 안전한 패턴 매칭이 가능합니다.
코틀린의 패턴 매칭은 주로 `when` 표현식과 `is` 연산자를 통해 이루어집니다.
이 두 가지를 활용하면 코드의 가독성을 높이고, 복잡한 조건문을 간결하게 작성할 수 있습니다.
1. `when` 표현식 `when` 표현식은 여러 조건을 검사하고 그에 따라 다른 블록의 코드를 실행할 수 있는 강력한 도구입니다.
`when`은 switch 문과 유사하지만, 더 많은 기능을 제공합니다.
기본 사용법 ```kotlin fun describe(obj: Any): String { return when (obj) { 1 -> "One" "Hello" -> "Greeting" is Int -> "Integer" else -> "Unknown" } } ``` 위의 예제에서 `describe` 함수는 입력된 객체의 타입이나 값을 검사하여 적절한 문자열을 반환합니다.
`when` 표현식은 `1`, `"Hello"`와 같은 특정 값뿐만 아니라 `is` 키워드를 사용하여 타입을 검사할 수도 있습니다.
여러 조건 결합 여러 조건을 결합하여 하나의 블록에서 처리할 수도 있습니다.
```kotlin fun getColorDescription(color: String): String { return when (color) { "Red", "Green", "Blue" -> "Primary Color" "Yellow", "Cyan", "Magenta" -> "Secondary Color" else -> "Unknown Color" } } ``` 위의 예제에서는 `Red`, `Green`, `Blue`와 같은 여러 조건을 하나의 블록으로 묶어서 처리하고 있습니다.
2. `is` 연산자 `is` 연산자는 객체의 타입을 검사하는 데 사용됩니다.
이를 통해 객체가 특정 타입인지 확인하고, 그에 따라 적절한 처리를 할 수 있습니다.
```kotlin fun printLength(obj: Any) { if (obj is String) { println("String length: ${obj.length}") } else if (obj is Collection<*>) { println("Collection size: ${obj.size}") } else { println("Unknown type") } } ``` 위의 예제에서 `printLength` 함수는 객체가 문자열인지, 컬렉션인지 검사하여 각각의 길이나 크기를 출력합니다.
3. 스마트 캐스팅 코틀린에서는 `is` 연산자를 사용한 후, 해당 객체가 특정 타입으로 확인되면 자동으로 그 타입으로 캐스팅됩니다.
이를 스마트 캐스팅이라고 합니다.
```kotlin fun handleInput(input: Any) { when (input) { is String -> println("String of length ${input.length}") is Int -> println("Integer value $input") else -> println("Unknown type") } } ``` 위의 예제에서 `input`이 `String`으로 확인되면, 별도로 캐스팅하지 않아도 `input.length`를 사용할 수 있습니다.
4. `when`과 `is`의 결합 `when` 표현식과 `is` 연산자를 결합하여 더욱 복잡한 패턴 매칭을 수행할 수 있습니다.
```kotlin fun processInput(input: Any) { when (input) { is String -> println("Processing string: $input") is Int -> when { input < 0 -> println("Negative integer") input > 0 -> println("Positive integer") else -> println("Zero") } else -> println("Unsupported type") } } ``` 위의 예제에서는 `input`이 `String`인지 `Int`인지 확인하고, `Int`인 경우에는 추가적인 조건을 사용하여 양수, 음수, 또는 0을 처리합니다.
결론 코틀린에서 패턴 매칭은 `when` 표현식과 `is` 연산자를 통해 매우 유용하게 사용할 수 있습니다.
이를 통해 코드의 가독성을 높이고, 다양한 데이터 타입을 효율적으로 처리할 수 있습니다.
패턴 매칭을 적절히 활용하면 복잡한 조건문을 간결하게 작성할 수 있으며, 코드의 유지보수성을 향상시킬 수 있습니다.
작성자:
이민주 [비회원]
| 작성일자: 1년 전
2024-09-09 09:47:20
조회수: 121 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 121 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.