Kotlin문법 - 특별한 타입들: Unit, Any, Nothing

느린달팽이·2025년 9월 24일

코틀린 복습

목록 보기
19/25

코틀린은 자바의 타입 시스템을 개선하여 Unit, Any, Nothing 이라는 세 가지 특별한 타입을 제공합니다.

이들은 함수의 반환, 타입 계층, 예외 처리를 명확하게 정의하는 데 중요한 역할을 합니다.


1. Unit: 반환값이 없는 함수

  • 정의: 반환 값이 없음을 나타내는 타입 (자바의 void와 유사).
  • 차이점: void는 키워드지만, Unit은 실제 타입이며 단 하나의 인스턴스만 존재.
  • 제네릭 활용 가능: Unit은 타입이므로 제네릭 인자로 사용할 수 있음.
  • 사용 용도: 반환할 데이터는 없지만, 함수가 동작을 마쳤음을 명시적으로 표현할 때.
fun exampleFunction(): Unit {
    println("This function returns Unit.")
}

// 반환 타입 생략 시 자동으로 Unit 추론
fun exampleFunction2() {
    println("This function also returns Unit.")
}

2. Any: 모든 타입의 부모

  • 정의: 코틀린 모든 클래스의 최상위 타입 (자바의 Object와 유사).
  • 특징: 기본 타입(Int, String 등)까지 포함.
  • 주의점: Any는 null 불가. null 허용 시 Any? 사용해야 함.
  • 사용 용도: 다양한 타입을 하나의 변수/컬렉션에 담고 싶을 때.

//any 메소드(함수)

  • equals(other:any) , hashCode(), toString() 등 있음
fun printAny(value: Any) {
    println("받은 값: $value")
    println("값의 타입: ${value::class.simpleName}")
}

fun main() {
    printAny("안녕하세요!") // String
    printAny(12345)       // Int
    printAny(true)        // Boolean
}

3. Nothing: 존재하지 않는 값

  • 정의: 어떤 값도 가질 수 없는 타입. 인스턴스 생성 불가.
  • 의미: 함수가 정상적으로 종료되지 않음을 컴파일러에게 알려줌.
  • 사용 용도: 예외 발생, 무한 루프, 프로그램 흐름이 끊기는 상황에 사용.
  • 활용 사례:
    • fail() 같이 반드시 예외를 던지는 함수.
    • ?: (엘비스 연산자)와 함께 null 처리.
fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

fun main() {
    val name: String? = "코틀린"
    val safeName = name ?: fail("이름이 없습니다!") // "코틀린" 할당

    val anotherName: String? = null
    val anotherSafeName = anotherName ?: fail("이름이 없습니다!")
    println("이 코드는 실행되지 않습니다.") // 도달 불가
}

추가로 알면 좋은 점

  • Void와 Unit의 차이
    • Void(자바): null만 가질 수 있는 참조 타입.
    • Unit(코틀린): 단일 인스턴스를 가지며 실제 객체.
  • Nothing? 타입
    • Nothing?null만 허용하는 타입. 일반적으로 잘 쓰이지 않지만, API 설계에서 의미를 명확히 할 때 활용 가능.
  • 타입 계층 구조
    Nothing  ←  (모든 하위 타입의 시작점, 값 없음)
         ↑
       String, Int, Boolean ...  ← 일반 타입들
         ↑
        Any   ← 최상위 부모
         ↑
       Unit   ← 반환값 없음(특수 케이스)

output.png

이 다이어그램은 Kotlin 타입 계층 구조를 보여줍니다:

  • 최상위는 Any
  • String, Int, Boolean 등 모든 구체 타입이 Any를 상속
  • Unit 역시 Any의 하위 타입
  • Nothing은 모든 타입의 하위 타입(즉, "값이 존재하지 않음")
profile
한걸음이라도 제대로... 쓰임있는 앱을 만들자

0개의 댓글