Scala의 데이터는 literal, value, variable로 구별되며, 각각은 해당하는 type이 있다. 각 용어에 대한 정의는 다음과 같다.
- literal : source code에서 직접적으로 나타나는 데이터를 의미한다.
- value : 변경 불가능한 타입이 정의된 데이터로 한번 할당되면 재할당이 불가능하다
- variable : 변경 가능한, 타입이 정외된 데이터로 데이터는 재할당 가능하다.
- type : 데이터의 유형을 의미한다.
데이터는 더이상 사용되지 않으면 JVM의 garbage collection에 의해서 해제된다.
1. Value
Scala의 Value는 다음으로 정의 된다.
val <identifier> [: <type>] = <data> 예) val x: Int = 5 |
type을 명시적으로 정의해주지 않으면 Scala Compiler가 추론해서 정의한다. 이를 type inference 라고 한다. 다음은 그 예이다.
scala> val y=20 y: Int = 20 scala> val hello="World" hello: String=World |
2. Variable
Scala의 variable은 다음으로 정의된다.
var <identifier> [: <type>] = <data> 예) var x: Double=2.72 |
value와 같이 type을 정의해주지 않으면 Scala Compiler가 추론해서 정의한다. variable은 재할당이 가능하다. 재할당할때 Type이 일치하지 않을 경우 type mismatch 오류가 발생한다. 단 Double 형의 variable에 Int 형의 값을 할당하면 자동으로 Int 가 Double로 변환된다. (그 반대는 오류가 발생한다.)
3. Naming
영문자(letter), 숫자 특정 범위의 operator 문자를 사용할수 있다. Operator는 *, +와 같은 수학적 연산자와 기호를 사용하게 하여 더 표현적으로 코드를 만들어준다. Scala Language Specification에서는 이 operator를 \u0020-007F 의 문자 그리고 Symbol/Math에 해당하는 unicode category의 문자중 ([])와 .(periods)를 제외한 문자로 정의한다. Identifier가 되기 위해서는 다음의 규칙을 따라야 한다.
1. 하나의 영문자(letter) 이후 0개 이상의 영문자(letter) 또는 숫자
2. 상기 1다음에 _ 그리고 하나 이상의 영문자(letter) 또는 숫자 또는 operator 문자
3. 하나 또는 그 이상의 operator 문자
4. backquote로 싸여져 있는 하나 또는 그 이상의 문자(Character)
다음은 Naming 사례이다.
scala> val ® = "All right reserverd" ®=: String = All right reserverd |
4. Types
Scala는 value와 variables의 Type을 정의하게 되며 Int, Double과 같은 numeric type과 String같은 nonnumeric type을 제공한다. 이런 core type은 object와 collection을 포함한 다른 type들에 대한 구성블럭이 되며 그 자체가 method와 operator를 가지고 있는 object이다.
4.1 Numeric Data Type
다음은 Core numeric type에 대한 표이다.
Scala는 number type의 rank에 따라서 number type간 자동 변환을 해준다. 상기 표의 순서가 rank가 가장 낮은 것은 Byte 형이고 Byte형은 다른 number type으로 자동 변환될 수 있다. 낮은 rank의 number를 상위 rank의 number로 변환하는 것은 가능하지만 상위 rank의 number를 낮은 rank의 number로 자동 변환은 불가능하다.
상위 rank의 숫자를 낮은 rank로 명시적으로 변환하기 위해서 toType 메소드를 이용할수 있다. 이때 데이터의 유실이 발생할수 있다. 다음은 그 사례이다.
scala> val f: Double=20.2 f: Double = 20.2 scala> val i: Int=f.toInt i: Int = 20 |
다음은 숫자 표기에 따른 Type 정의이다. (Type inference에 명시적으로 전달하는 방법중 하나이다.)
4.2 Strings
Scala의 String은 Java의 String에 기반하지만 multiline literals 와 string interpolation과 같은 독특한 특징을 추가하였다. String은 double quotes 사이에 특수 문자는 back-slash 다음에 오도록 정의된다. String Type은 math operator를 이용 가능한데, == 는 두 String의 value가 같은지를 비교한다. 이는 string object의 reference를 확인하는 java와는 다른 특성이다. 다음은 String의 연산자 이용 사례이다.
scala> val threefoo="Three "+"Foo "*3 threefoo: String = "Three Foo Foo Foo " |
multiline string는 triple-quotes 를 이용해서 정의하며, multiline string에서는 back-slash 도 문자 그대로 출력된다. 다음은 multiline string 정의이다.
scala> val multiline: String=""" Hi | I am "foo". | Who are you? | I am \t"bar".""" multiline: String = " Hi I am "foo". Who are you? I am \t"bar"." |
String interpolation은 특별한 모드인데, 외부의 값과 변수가 string 안에서 인식되고 변환된다. String의 "앞에 s prefix를 붙이면 "" 안의 $ operator는 외부 데이터의 참조를 가르키는 용도로 사용 가능하다. $이후의 identifier에 string을 붙여야 하는 경우 {}을 붙여준다. {}안에는 연산을 포함해서 사용 가능하다.
scala> val luckynum=7 luckynum: Int = 7 scala> s"${luckynum}even up" res3: String = 7even up scala> s"3/5 is ${3.0/5.0}" res5: String = 3/5 is 0.6 scala> s"boox3 is ${"boo"*3}" res7: String = boox3 is boobooboo |
String interpolation의 대안으로 printf 형태의 formatting format을 이용 가능하다. printf 형태는 " 앞에 f를 붙이면 된다.
scala> f"Printf Formatting ${0.12345678}%.5f" res8: String = Printf Formatting 0.12346 |
4.3 Regular Expression
Any, AnyVal, AnyRef는 Scala의 Type 계층에서 root이다. Any는 모든 객체의 Root가 된다. AnyVal은 Value Type에 대한 Root가 되며 AnyRef는 Reference Type에 대한 Root가 된다. Nothing은 모든 타입의 subtype이 된다. Nothing은 return type에 대한 호환성을 제공하기 위한 것이다. Nothing은 type으로만 이용되며 instantiated 될 수 없다.
다음은 Scala의 모든 타입이 사용가능한 operation 이다.
4.4 Tuples
tuple은 2개이상의 값을 가지는 순서가 있는 컨테이너이다. 논리적으로 값을 그루핑하고 연계된 하나의 단위로 표현할때 사용한다. list나 array처럼 iterate 할 방법은 없다. 다음으로 Tuple을 생성할수 있다.
( <value 1>, <value 2> [, <value 3>...]) |
tuple의 access는 _에 해당 index 숫자를 붙인다. 크기가 2인 tuple은 -> 로 생성할수 있다. 다음은 Tuple 생성, 접근, -> 예이다.
scala> val tupletst=("Hello","World",5) tupletst: (String, String, Int) = (Hello,World,5) scala> tupletst._3 res1: Int = 5 scala> val tupletst2=tupletst->"More" tupletst2: ((String, String, Int), String) = ((Hello,World,5),More) scala> val apple="apple"->"red" apple: (String, String) = (apple,red) |
Reference
Learning Scala, Oreilly