더북(TheBook)

2.2 기본 타입

이 절에서는 수, 문자, 불 값 등을 표현하는 코틀린 타입을 살펴본다. 자바에 익숙하다면 이런 타입을 자바 원시 타입(primitive type)이라고 생각해도 되지만, 이 대응이 완벽하지는 않다. 자바에서는 int와 같은 원시 타입(원시 타입의 값은 메서드의 스택 영역에 저장될 수 있다)과 String 같이 클래스를 기반으로 하는 참조 타입(이런 참조 타입의 값은 동적으로 힙에 할당된 메모리를 가리키는 참조일 뿐이다) 사이에 명확한 구분이 있었다. 코틀린에서는 똑같은 타입( Int)이 문맥에 따라 원시 타입과 참조 타입을 가리키기 때문에 이런 구분이 약간 모호하다. 자바에는 원시 타입을 감싸는 특별한 박싱 타입(boxing type)이 있지만, 코틀린은 필요할 때 암시적으로 박싱을 수행한다.

자바 vs. 코틀린 자바와 달리 모든 코틀린 타입은 근본적으로 어떤 클래스 정의를 기반으로 만들어진다. 이 말은 Int와 같이 원시 타입과 비슷한 타입들도 메서드와 프로퍼티를 제공한다는 뜻이다. 예를 들어 1.5.toInt()라는 식으로 1.5에 대해 Double 타입에 정의된 toInt() 메서드를 호출할 수 있다. 이 메서드는 Double 값을 Int 값으로 변환해준다.

타입은 하위 타입(subtype)이라는 개념으로 계층화할 수 있다. A 타입이 B 타입의 하위 타입이라는 말은 근본적으로 B 타입의 값이 쓰일 수 있는 모든 문맥에 A 타입의 값을 넣어도 아무 문제가 없다는 뜻이다. 예를 들어, 널을 허용하지 않는 모든 코틀린 타입은 Any라는 내장 타입의 직간접적인 하위 타입이다. 따라서 다음 코드는 1이라는 값을 박싱하게 만든다.

val n: Any = 1 // Ok: Int는 Any의 하위 타입

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.