HOWTO · Scala
Scala에서 변수 유형 찾기
이 기사에서는 Scala에서 변수 유형을 찾는 방법에 대해 설명합니다.
이 페이지의 내용
Scala에는 모든 타입 질문에 답하는 단일 typeof 연산이 없습니다. 변수의 선언된 타입이나 추론된 타입은 컴파일 시점의 속성입니다. 런타임에는 객체의 클래스를 살펴보거나, 알려진 타입에 따라 분기하거나, 값이 특정 타입에 해당하는지 확인하거나, 제네릭 타입 메타데이터를 요청할 수 있습니다. 코드에 필요한 정보가 무엇인지에 따라 방법을 선택하세요.
런타임 타입이 무엇을 뜻하는지에 따라 선택하기
프로그램이 처리할 경우를 알고 있다면 패턴 매칭을 사용하세요. 객체의 런타임 클래스를 살펴보려면 getClass를, 더 짧은 표시 이름이 필요하면 getSimpleName을 사용하세요. 지정한 한 가지 타입에 대한 참·거짓 확인에는 isInstanceOf를 사용합니다. 제네릭 타입 정보가 필요할 때는 Scala의 Manifest와 TypeTag를 사용할 수도 있습니다. 이 둘은 메타데이터를 제공하는 방법이며, 앞의 연산을 모두 대체하는 범용 기능은 아닙니다.
알려진 타입에는 패턴 매칭 사용하기
패턴 매칭은 값을 코드에 작성한 각 경우와 비교합니다. 다음 독립 실행 예제는 몇 가지 흔한 값에 이름을 붙이고, 그 밖의 값에는 기본 결과를 반환합니다. 스크립트를 실행할 때 호스트 이름 조회를 피하도록 실행기에서 Scala 컴파일 데몬을 비활성화합니다.
scala -nocompdaemon -e '
def label(value: Any): String = value match {
case _: String => "String"
case _: Int => "Int"
case _: Double => "Double"
case _ => "Other"
}
List[Any]("hello", 42, 3.14).foreach(value => println(label(value)))
'
String
Int
Double
이 방법은 알려진 각 경우에 서로 다른 동작이 필요할 때 유용합니다. 가능한 모든 타입을 자동으로 찾아내지는 않습니다. 봉인된 사용자 정의 계층 구조라면 구체적인 케이스 클래스를 매칭하고, 계층 구조나 입력이 여기서 처리하는 경우보다 확장될 수 있다면 기본 경우도 포함하세요.
getClass로 객체의 런타임 클래스 살펴보기
value.getClass를 호출하면 객체의 런타임 Class를 얻습니다. 예를 들어 val runtimeClass = value.getClass로 클래스를 살펴보거나 다른 클래스와 비교할 수 있습니다. 이는 객체의 런타임 클래스를 나타내며 변수의 선언된 타입을 알려 주지는 않습니다. 제네릭 타입 인수를 완전히 설명하지도 않습니다.
더 짧은 표시 이름이 필요하면 value.getClass.getSimpleName을 사용하세요. 이 문자열은 화면에 보여 주는 텍스트로 취급해야 합니다. 클래스 이름은 구현에 따라 달라질 수 있으며, 단순 이름은 안정적인 타입 검사 API가 아닙니다. 사용자 정의 객체도 기본 제공 객체와 같은 방식으로 살펴볼 수 있습니다.
Manifest와 TypeTag로 제네릭 타입 정보 얻기
제네릭 타입 매개변수는 런타임에 객체만으로 항상 확인할 수 있는 것은 아닙니다. Scala의 Manifest와 TypeTag는 제네릭 코드에서 요청할 수 있는 타입 메타데이터를 제공하지만, 실제 정보의 범위는 해당 타입과 사용 중인 Scala 환경에 따라 달라집니다. 예를 들어 Scala 코드에서 (implicit m: Manifest[T])와 같은 메서드 매개변수를 선언하거나 TypeTag[T] 컨텍스트 바운드를 사용한 뒤, T에 제공된 메타데이터를 살펴볼 수 있습니다.
제네릭 메서드에서 타입 매개변수에 관한 정보가 필요할 때 이러한 방법이 도움이 될 수 있습니다. 모든 값에 대해 완전한 정보를 보장하지 않으며, 문자열 표현을 안정적인 직렬화 형식으로 취급해서도 안 됩니다. 알려진 몇 가지 경우에 따라 분기하거나 한 가지 타입을 확인하는 것이 목적이라면 패턴 매칭이나 isInstanceOf가 더 직접적입니다.
isInstanceOf로 값의 타입 확인하기
필요한 결과가 단순히 true 또는 false라면 value.isInstanceOf[SomeType]을 사용하세요. String 같은 타입뿐 아니라 지정한 사용자 정의 타입에도 사용할 수 있습니다. 이 식은 값이 해당 타입 검사에 부합하는지 알려 줄 뿐, 타입 설명을 반환하거나 컬렉션의 요소 타입을 보여 주지는 않습니다.
타입마다 별도 처리가 필요하다면 패턴 매칭을 사용하는 편이 좋습니다. 패턴 매칭은 검사와 처리를 하나의 식으로 결합합니다. 런타임에 확인할 수 없는 제네릭 인수를 타입 검사로 알아내려 하지 마세요.
작업에 맞는 방법 선택하기
- 알려진 대안 집합을 처리하려면 기본 경우를 포함한 패턴 매칭을 사용하세요.
- 객체의 런타임 클래스를 살펴보거나 표시하려면
getClass를 사용하고, 간결한 이름을 표시할 때만getSimpleName을 사용하세요. - 지정한 한 가지 타입에 대해 예 또는 아니요를 확인하려면
isInstanceOf를 사용하세요. - 제네릭 코드에서 타입 메타데이터를 요청하려면
Manifest또는TypeTag를 고려하고, 사용 중인 Scala 환경에서 제공되는 메타데이터의 범위를 확인하세요.
어느 방법도 범용 typeof는 아닙니다. 선언된 타입은 컴파일 시점 검사에 속하며, 런타임 연산은 각 방법이 제공하도록 설계된 클래스, 검사 결과 또는 메타데이터만 보여 줍니다.