타입과 타입 시스템
타입과 타입 시스템 (Types and the Type System)
Scala는 정적 타입 언어인데도 코드를 짜다 보면 꽤 유연하고 동적으로 느껴질 때가 많아요. 그 비결이 바로 타입 추론(type inference) 덕분이에요. 변수 타입을 하나하나 적어주지 않아도 Scala가 알아서 추론해 주니까요. 그 흐름을 따라가 볼게요.
출처: Scala 3 Book
본문
Scala는 정적 타입(static typing)을 쓰면서도, 자주 유연하고 동적으로 느껴지는 독특한 언어예요. 예를 들어 타입 추론 덕분에 변수 타입을 명시하지 않고 이런 코드를 쓸 수 있어요:
val a = 1
val b = 2.0
val c = "Hi!"
이렇게 하면 마치 동적 타입 언어처럼 느껴지죠. 그리고 Scala 3의 새로운 기능, 예를 들어 유니언 타입(union types) 덕분에 어떤 값이 인자로 들어오고 어떤 타입이 반환되는지를 아주 간결하게 표현하는 코드도 작성할 수 있어요:
def isTruthy(a: Boolean | Int | String): Boolean = ???
def dogCatOrWhatever(): Dog | Plant | Car | Sun = ???
예시에서 보여주듯, 유니언 타입을 쓰면 타입들이 공통된 계층(공통 부모)을 공유하지 않아도 되고, 그래도 인자로 받거나 메서드에서 반환할 수 있어요.
애플리케이션 개발자라면 타입 추론을 매일 쓰게 되고, 제네릭(Generics) 은 매주쯤 쓰게 될 거예요. 클래스와 메서드의 Scaladoc을 읽을 때는 variance(변성)에 대한 이해도 어느 정도 필요해요. 다행히 타입을 사용하는 건 생각보다 단순하면서도, 라이브러리 개발자에게는 큰 표현력과 유연성, 그리고 통제력을 제공한다는 걸 알게 될 거예요.
타입의 장점
정적 타입 언어는 여러 장점을 제공해요:
-
강력한 IDE 지원을 돕는다
-
컴파일 시점에 잠재적인 오류의 여러 부류를 제거한다
-
리팩토링을 돕는다
-
타입 검사가 이루어지기 때문에 결코 구식이 될 수 없는 강력한 문서 역할을 한다
Scala 타입 시스템의 기능
간단한 소개였지만, 이어지는 섹션들에서 Scala 타입 시스템의 여러 기능들에 대한 개요를 살펴볼게요.