본문 바로가기

프로그래밍/scala

스칼라의 기본 타입과 연산


리터럴literal 은 상수 값을 코드에 직접 적는 방법을 말하며 자바와 동일하며, 문자열의 경우 참고로 아래와 같다.

val c = '\101' // Char A 와 같이 문자 코드 포인트Unicode character code point 통해 표현

val d = '\u0041' // 유니코드 문자를 \u + 4자리 16진수를 통해 표현

val B\u0041\u0044 = 1 // 같이 BAD 변수의 값이 1을 지정 - 모든 변수 함수 코드까지고 유니코드로 


문자열 특수문자와 무관하게 출력

println("""|문장의 앞 공백을 제거하고,

                |여러 "특수문자"를 섞어 쓰는 예제.""".stripMargin)


심볼 리터럴은 'ident 라고 사용하는 경우 컴파일러가 Symbol("cymbal")이라는 팩토리 메소드 호출로 변경한다. 그리고 심벌을 이용해서 파라메터로 전달하고 싶은 경우에도 직접 Symbol 유형을 선언할 필요가 없고, 해당 값을 심볼 리터럴 형태로 넘기면 된다. updateRecordByName('favoriteAlbum, "Let it be") 또한 동일한 심볼의 경우에는 완전히 동일한 객체를 참조한다.


모든 메소드는 연산자가 될 수 있다. 심지어 음수를 표현하는 - 기호 또한 "전위 표기법"으로 이해할 수 있다.

val s = "Hello, world!"

val r1 = s.indexOf('o', 5)   // 메소드 형식

val r2 = s indexOf ('o', 5) // 연산자 형식

assert(r1 == r2)


단항 연산자unary 에서는 -2.0 이라는 표현식은 (2.0).unary_- 형태로 변환된다.


후위 연산자는 인자를 취하지 않는 메소드들 '.'이나 괄호 없이 호출하는 경우이며, 이러한 경우 빈 괄호를 생략할 수 있다. 관례상 메소드에 부수 효과가 있다면 괄호를 넣고, 그렇지 않다면 s toLowewCase 처럼 괄호를 사용하지 않는다.


산술 연산에서 나머지 계산 시에 IEEE 754 표준은 버림truncating 나눗셈이지만, 스칼라 기본값은 반올림rouding 나눗셈이므로, IEEE 754 표준을 꼭 따라가야 한다면 scala.math 의 IEEEremainder 메소드를 호출하면 된다.

scala> math.IEEEremainder(11.0, 4.0) // 일반적으로 생각하면 나머지는 3으로 예상하지만, 정답은 -1.0


스칼라의 경우 모든 연산자가 함수인데 두 개의 operand 자체를 넘기지(계산하지)않고 쇼트 서킷short circuit 이 가능한 이유는 스칼라 메소드에는 인자 계산을 미루는 기능이 있기 때문인데, 이를 호출(call by name) 파라메터라 부른다.


시프트 연산자는 자바와 동일하며 <<, >>, 부호없는 오른쪽 시프트(>>>) 세가지다.

scala> -1 << 2

res22: Int = -4


scala> -1 >> 2

res23: Int = -1


scala> -1 >>> 2

res24: Int = 1073741823


스칼라의 == 연산자는 자바와 다르게 동작한다.

// Java

int a1 = 1, a2 = 1;

assert(a1 == a2); // 원시 타입의 경우에는 스칼라 자바 모두 값을 비교하므로 동일하게 동작.

Integer b1 = new Integer(1);

Integer b2 = new Integer(1);

assert(b1 == b2); // 참조타임인 경우 자바에서는 레퍼런스 아이디를 보기 때문에 두 참조가 같은지를 비교하므로 false.


// Scala

scala> val a: Integer = new Integer(3)

a: Int = 3

scala> val b: Integer = new Integer(3)

b: Int = 3

scala> a == b // 스칼라는 JVM 힙heap 상에서의 같은 객체를 가리키고 있는지를 비교한다.

res30: Boolean = true


연산자 우선순위precedence

1. (그 밖의 모든 특수문자)

2. * / %

3. + -

4. :

5. !=

6. < >

7. &

8. ^

9. |

10. (모든 문자)

11. (모든 할당 연산자)

  * 단, val a *= ( y + 1 ) 연산의 경우 *= 는 할당 연산자 이므로 ( y + 1 ) 연산이 먼저 수행된다.


퀴즈1) a ::: b 와 같은 연산에서는 실제로 어떤 순서대로 동작하는가?


풍부한 래퍼 연산

scala> 0 max 5

res32: Int = 5


scala> 0 min 5

res33: Int = 0


scala> -2.7.abs

res1: Double = 2.7


scala> (1.0 / 0).isInfinity

res2: Boolean = true


scala> 4 to 6

res3: scala.collection.immutable.Range.Inclusive = Range(4, 5, 6)


scala> "bob".capitalize

res4: String = Bob


scala> "bob".capitalize

res5: String = Bob


scala> "robert".drop(2)

res6: String = bert


'프로그래밍 > scala' 카테고리의 다른 글

스칼라 함수형 객체  (0) 2016.01.21
스칼라의 클래스와 객체  (0) 2016.01.16
스칼라 두 번째 걸음  (0) 2016.01.14