본문 바로가기

Languages/Scala

[스칼라] 데이터 타입, 표현식

반응형

스칼라는 Java와 달리 primitive type이 없습니다. 즉, 모든 데이터들은 객체로 취급됩니다.

작업하는 데이터의 종류를 스칼라에서는 타입 type 이라 부르며, 스칼라의 모든 데이터는 타입에 대응됩니다.

다음 그림은 스칼라의 타입 계층 구조 다이어그램입니다.

Scala type hierarchy 이미지 출처 : https://docs.scala-lang.org/tour/unified-types.html

Any는 스칼라에서 모든 타입의 루트이며, 톱타입이라고도 합니다. equals, toString 등의 범용 메소드가 정의되어 있으며, 인스턴스화 될 수 없고, 모든 값 타입의 루트인 AnyVal과 모든 참조 타입의 루트인 AnyRef를 서브클래스로 가집니다. 이 두 클래스 역시 인스턴스화 될 수 없습니다.

Nothing은 모든 타입의 서브타입이며, 타입으로만 사용되고 마찬가지로 인스턴스화 될 수 없습니다.

문자 그대로 널(null)값을 의미하는Null은 AnyRef의 서브타입으로 키워드 null에 타입을 제공하기 위해 존재하는 타입입니다. 이는 주로 다른 JVM 언어와의 상호 호환성을 위해 존재하며, 스칼라에서는 최대한 사용하지 않는 것을 scala 공식 문서에서 권장하고 있습니다.

값이 없음을 나타내는 Unit 타입은 AnyVal의 서브타입입니다. C나 Java에서 사용하는 void 키워드와 유사한 역할을 수행합니다.

여기서 한 가지 주목할 점은 다른 언어와 달리 스칼라에서는 다른 타입을 Boolean 타입으로 자동 전환하지 않는다는 부분입니다. (0은 false와 다릅니다.)

 

스칼라에서 리터럴이란 소스 코드에 바로 등장하는 데이터를 의미하고,

val 키워드를 사용하며 불변의 타입을 갖는 저장 단위입니다. val 키워드를 사용하여 할당한 값은 절대로 재할당될 수 없습니다.

변수var 키워드를 사용하며 가변의 타입을 갖는 저장 단위로, 언제라도 변수에 할당한 값은 재할당이 가능합니다.

 

스칼라에서는 변수(var) 보다 값(val) 사용을 권장하는데, 값을 사용했을 경우 안정적이고 예측 가능한 소스 코드를 작성할 수 있으며 참조 투명성을 제공하여 가변 데이터보다 안정적이기 때문입니다.

 

스칼라에서 값 혹은 변수를 할당할 때에는 다음과 같이 작성합니다 : [값|변수 키워드] [식별자](:타입) = [리터럴]

//값
val identifier:Type = literal

//변수
var identifier:Type = literal

여기서 값 혹은 변수를 정의할 때 명시적으로 타입을 작성하지 않고 선언해 줄 수도 있는데, 이는 스칼라 컴파일러가 할당된 값을 보고 그 값의 타입을 추론(type inference)할 수 있기 때문입니다.

 

표현식 expression은 값을 반환하는 코드 단위입니다. 값을 반환하지 않는 표현식은 문장 statement이라고 칭합니다. 중괄호로 감싸진 표현식들은 표현식 블록 expression block 이라고 부르며 자신만의 범위(스코프)를 가집니다. 표현식 블록의 마지막 표현식이 전체 블록의 반환값이 됩니다.

//표현식
val identifier:Type = expression

//표현식 블록
val amount = {
	val x = 5
	x + 5      //반환값
}

 

스칼라는 모든 데이터가 객체로 취급되며, 자바 언어에서의 연산자도 메소드로 정의되어 있습니다.

 

반응형