통합 타입
통합 타입 (Unified Types)
스칼라에서는 숫자 값이든 함수든 모든 값이 타입을 가져요. 그러다 보니 타입들이 서로 어떤 관계로 얽혀 있는지, 그 계층의 골격을 먼저 잡아두면 나머지 개념이 훨씬 쉽게 받아들여져요. 이 페이지에서는 최상위 타입 Any부터 시작해 AnyVal·AnyRef를 거쳐 맨 아래의 Nothing·Null까지, 타입 계층의 뼈대를 함께 살펴볼게요.
Scala 타입 계층
Any는 모든 타입의 수퍼타입이고, 가장 위에 있는 타입이라서 top type이라고도 불러요. Any는 equals, hashCode, toString 같은 보편적인 메서드를 정의하고 있어요. 그리고 Any의 바로 아래 자식 타입은 AnyVal과 AnyRef 두 가지예요.
AnyVal은 값 타입을 나타내요. 미리 정의된 값 타입은 아홉 가지이고, 전부 null이 될 수 없어요: Double, Float, Long, Int, Short, Byte, Char, Unit, Boolean. 그중 Unit은 별다른 의미 있는 정보를 담지 않는 값 타입이에요. Unit의 인스턴스는 정확히 하나뿐이고, 리터럴로는 ()처럼 써요. 모든 함수는 뭔가를 반환해야 하기 때문에, 때로는 Unit이 유용한 반환 타입이 돼요.
AnyRef는 참조 타입을 나타내요. 값 타입이 아닌 모든 타입은 참조 타입으로 정의되고, 스칼라에서 사용자가 정의한 모든 타입은 AnyRef의 서브타입이죠. 스칼라를 Java 런타임 환경에서 쓴다면 AnyRef는 java.lang.Object에 해당해요.
문자열·정수·문자·불리언·함수가 전부 다른 객체들과 마찬가지로 Any 타입이라는 걸 보여주는 예시예요:
val list: List[Any] = List(
"a string",
732, // an integer
'c', // a character
true, // a boolean value
() => "an anonymous function returning a string"
)
list.foreach(element => println(element))
list라는 값은 List[Any] 타입이에요. 서로 다른 여러 타입의 원소로 초기화했지만, 각 원소가 scala.Any의 인스턴스이기 때문에 한 리스트에 담을 수 있어요.
프로그램 출력 결과예요:
a string
732
c
true
<function>
타입 캐스팅 (Type Casting)
값 타입은 다음과 같은 방식으로 캐스팅할 수 있어요. 새 버전의 스칼라에서는 정밀도가 손실될 수 있기 때문에 Long에서 Float로의 변환은 deprecated예요.
예를 들어:
val x: Long = 987654321
val y: Float = x.toFloat // 9.8765434E8 (note that some precision is lost in this case)
val face: Char = '☺'
val number: Int = face // 9786
캐스팅은 단방향이에요. 아래 코드는 컴파일되지 않아요:
val x: Long = 987654321
val y: Float = x.toFloat // 9.8765434E8
val z: Long = y // Does not conform
참조 타입을 그 서브타입으로 캐스팅하는 것도 가능한데, 그 부분은 투어에서 나중에 다룰게요.
Nothing과 Null
Nothing은 모든 타입의 서브타입이고, bottom type이라고 불러요. Nothing 타입을 갖는 값은 존재하지 않아요. 주로 예외를 던지거나 프로그램을 종료하거나 무한 루프처럼 정상적으로 끝나지 않는 상황을 나타내는 데 쓰죠. 다시 말해 값을 평가하지 않는 표현식이나 정상적으로 반환하지 않는 메서드의 타입이에요.
Null은 모든 참조 타입, 그러니까 AnyRef의 모든 서브타입의 서브타입이에요. null이라는 키워드 리터럴로 식별되는 값이 하나 있죠. Null은 주로 다른 JVM 언어와의 상호 운용을 위해 제공되며, 스칼라 코드에서는 거의 쓰지 않는 게 좋아요. null을 대신할 방법은 투어에서 나중에 다룰게요.
더 알아보기
- 클래스 (Classes) — 타입을 직접 정의하는 방법
- 케이스 클래스 (Case Classes) — 불변 데이터 모델링
- 패턴 매칭 (Pattern Matching) — 타입을 분해하는 패턴 매칭