|

코틀린 typealias는 언제 쓸까: 타입을 새로 만드는 것과 이름만 붙이는 것의 차이

코틀린 typealias는 언제 쓸까: 타입을 새로 만드는 것과 이름만 붙이는 것의 차이
typealias는 새 타입을 만드는 문법이 아니라 기존 타입에 더 읽기 쉬운 이름을 붙이는 문법입니다.

코틀린 typealias는 긴 타입 이름에 짧고 의미 있는 별칭을 붙이는 문법입니다. 콜백 타입이나 복잡한 generic 타입을 읽기 쉽게 만들 때 특히 편합니다.

핵심은 typealias가 새 타입을 만드는 것이 아니라 기존 타입의 다른 이름을 만드는 것입니다. 이 글은 Kotlin 공식 type aliases 문서를 기준으로 좋은 사용 예와 조심할 지점을 정리합니다.

코틀린 typealias 사용 기준 요약 카드
typealias는 타입 이름을 줄이지만 컴파일러 관점에서는 원래 타입과 같은 타입입니다.

코틀린 typealias를 먼저 한 줄로 정리하면

typealias는 기존 타입에 다른 이름을 붙이는 문법입니다. 타입 이름이 너무 길거나 함수 타입이 읽기 어려울 때 의미 있는 이름으로 바꿔 호출부를 정리할 수 있습니다.

typealias UserId = String
typealias OnClick = (UserId) -> Unit

fun bindClick(listener: OnClick) {
    listener("user-1")
}

이 코드는 `UserId`라는 이름을 쓰지만, 컴파일러 관점에서 새 타입이 생긴 것은 아닙니다. 여전히 실제 타입은 `String`입니다.

긴 타입 이름을 줄일 때 유용하다

중첩된 generic 타입이나 콜백 타입은 그대로 쓰면 함수 시그니처가 길어집니다. typealias를 쓰면 관심 있는 의미가 앞으로 나옵니다.

typealias UserCache = MutableMap<String, List<User>>
typealias ResultHandler = (Result<User>) -> Unit

새 타입을 만드는 것은 아니다

가장 중요한 주의점은 typealias가 타입 안정성을 추가하지 않는다는 점입니다. 별칭끼리 이름이 달라도 원래 타입이 같으면 서로 대입될 수 있습니다.

typealias UserId = String
typealias OrderId = String

fun findUser(id: UserId) {}

val orderId: OrderId = "order-1"
findUser(orderId)  // 타입 관점에서는 String이라 통과

도메인 개념을 컴파일러가 구분해 주길 원한다면 typealias만으로는 부족합니다. 이때는 value class 같은 다른 표현을 검토해야 합니다.

함수 타입 별칭은 읽기 좋아질 수 있다

콜백이나 이벤트 handler는 함수 타입이 길어지기 쉽습니다. typealias를 쓰면 함수의 모양보다 역할을 먼저 읽을 수 있습니다.

typealias Validator<T> = (T) -> Boolean

fun validateName(name: String, validator: Validator<String>): Boolean {
    return validator(name)
}

언제 쓰면 좋을까

  • 긴 generic 타입을 여러 곳에서 반복할 때
  • 함수 타입의 역할을 이름으로 설명하고 싶을 때
  • 외부 라이브러리 타입을 프로젝트 문맥에 맞게 읽고 싶을 때
  • 타입 구조보다 도메인 용어를 앞에 보여주고 싶을 때

언제 조심해야 할까

  • 새 타입이 생긴다고 착각할 때
  • UserId와 OrderId처럼 반드시 구분해야 하는 값을 같은 원시 타입 별칭으로만 둘 때
  • 별칭이 너무 많아 실제 타입을 추적하기 어려워질 때
  • 타입 이름을 줄였지만 오히려 의미가 모호해질 때

value class와 비교해서 보기

typealias는 이름만 바꿉니다. 반면 value class는 특정 값을 감싸는 별도 타입을 표현할 수 있어 도메인 구분에 더 강합니다.

@JvmInline
value class UserId(val value: String)

fun findUser(id: UserId) {}

정리

코틀린 typealias는 긴 타입에 읽기 쉬운 이름을 붙이는 도구입니다. 하지만 새 타입을 만드는 문법은 아니므로, 타입 안정성을 높이고 싶은 문제에는 다른 모델링 방법까지 함께 봐야 합니다.

Kotlin 문법 흐름은 코틀린 확장 함수는 왜 편할까, 코틀린 when은 switch와 무엇이 다를까, 코틀린 sealed class와 enum 차이와 함께 보면 좋습니다. 외부 기준은 Kotlin Docs – Type aliases, Kotlin Docs – Functional types, Kotlin Docs – Inline value classes를 확인했습니다.

함께보면 좋은 글