IMCAT.DEV
로그인 가입
Kotlin 고급 함수형

Kotlin 패턴 매칭 기법

Kotlin 패턴 매칭 기법 — 고급

패턴 매칭 기법

1. 도입 (왜 배워야 하는가)

Kotlin에서 패턴 매칭 기법은 데이터 구조를 효과적으로 분석하고, 조건에 따라 다양한 작업을 수행하는 데 매우 중요한 역할을 합니다. 특히, 객체 지향 프로그래밍과 함수형 프로그래밍이 결합된 Kotlin의 특성을 활용할 수 있는 강력한 도구입니다. 실무에서는 복잡한 데이터 구조를 다루면서 특정 조건에 맞는 데이터를 쉽게 추출하고 처리해야 할 경우가 많습니다.

이 기법을 모르면 코드가 장황해지고, 가독성이 떨어지며, 유지보수가 어려워질 수 있습니다. 예를 들어, 여러 조건문을 중첩하여 사용하는 경우, 코드의 흐름을 이해하기 힘들어지고, 버그 발생 가능성이 높아집니다.

2. 핵심 개념 설명

패턴 매칭: 특정 데이터의 형태나 내용을 기반으로 다양한 조건을 검사하는 기법입니다. 이는 마치 주어진 조건에 맞는 옷을 고르는 것과 비슷합니다. 예를 들어, "비 오는 날에는 우산을, 맑은 날에는 선글라스를" 고르는 것처럼, 데이터의 상태에 따라 적절한 행동을 결정합니다.

용어설명
when 표현식여러 조건을 검사하고 그에 따라 다른 코드를 실행하는 제어 구조
데이터 클래스불변 객체를 생성하기 위해 사용하는 클래스

3. 기본 코드 예제

아래는 when 표현식을 사용하여 패턴 매칭을 구현한 간단한 예제입니다.

fun describe(obj: Any): String {
    return when (obj) {
        1 -> "숫자 1입니다."
        "Hello" -> "문자열 Hello입니다."
        is Int -> "정수입니다."
        else -> "알 수 없는 타입입니다."
    }
}

fun main() {
    println(describe(1))         // 숫자 1입니다.
    println(describe("Hello"))   // 문자열 Hello입니다.
    println(describe(42))        // 정수입니다.
    println(describe(3.14))      // 알 수 없는 타입입니다.
}

실행 결과:

숫자 1입니다.
문자열 Hello입니다.
정수입니다.
알 수 없는 타입입니다.

코드 한 줄씩 동작 설명:

  1. describe 함수는 Any 타입의 객체를 인자로 받습니다.
  2. when 표현식을 사용하여 객체의 타입이나 값을 검사합니다.
  3. 객체가 1일 경우 "숫자 1입니다."를 반환합니다.
  4. 객체가 "Hello"일 경우 "문자열 Hello입니다."를 반환합니다.
  5. 객체가 Int 타입일 경우 "정수입니다."를 반환합니다.
  6. 위의 조건에 해당하지 않는 경우 "알 수 없는 타입입니다."를 반환합니다.
  7. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰의 장바구니에서 사용자가 선택한 상품의 타입에 따라 다른 처리를 할 수 있습니다.

    fun processItem(item: Any) {
        when (item) {
            is Book -> println("책을 장바구니에 추가했습니다.")
            is Electronic -> println("전자제품을 장바구니에 추가했습니다.")
            else -> println("기타 상품을 장바구니에 추가했습니다.")
        }
    }

    이 예제에서는 사용자가 장바구니에 추가한 아이템의 타입에 따라 적절한 메시지를 출력합니다.

    예제 2: API 응답 처리

    API로부터 받은 응답을 처리할 때 패턴 매칭을 사용할 수 있습니다.

    fun handleApiResponse(response: ApiResponse) {
        when (response) {
            is SuccessResponse -> println("성공적으로 응답을 받았습니다.")
            is ErrorResponse -> println("오류가 발생했습니다: ${response.errorMessage}")
            else -> println("알 수 없는 응답입니다.")
        }
    }

    이 예제는 API 응답에 따라 성공 또는 오류 메시지를 출력합니다.

    5. 흔한 실수와 주의사항

    실수 1: when에서 else를 생략

    fun evaluateNumber(num: Int): String {
        return when (num) {
            1 -> "One"
            2 -> "Two"
            // else가 없으면 num이 3일 경우 NullPointerException 발생 가능
        }
    }

    올바른 코드:

    fun evaluateNumber(num: Int): String {
        return when (num) {
            1 -> "One"
            2 -> "Two"
            else -> "Unknown number"
        }
    }

    실수 2: 타입 검사 후 사용

    fun checkType(obj: Any) {
        when (obj) {
            is String -> println(obj.length) // 올바른 사용
            is Int -> println(obj.length)    // 오류 발생
        }
    }

    올바른 코드:

    fun checkType(obj: Any) {
        when (obj) {
            is String -> println(obj.length)
            is Int -> println("정수입니다.")
        }
    }

    6. 정리

    • 패턴 매칭은 데이터 구조를 효과적으로 처리하는 데 도움이 됩니다.
    • when 표현식은 여러 조건을 간결하게 처리할 수 있는 강력한 도구입니다.
    • 타입 검사 후, 올바른 타입을 사용해야 오류를 피할 수 있습니다.
    • else 분기를 항상 작성하여 모든 경우를 처리해야 합니다.

다음에 학습하면 좋은 주제는 고급 함수형 프로그래밍, Kotlin의 확장 함수입니다. 이 토픽들은 패턴 매칭과 함께 Kotlin의 강력한 기능을 더욱 잘 활용하는 데 도움이 될 것입니다.