[7강] 특수 문자열 처리와 연산자 우선 순위

2015. 4. 18. 11:18Programming/Scala

특수문자 표현


스칼라에서도 아래와 같이 특수 문자의 표현이 가능하다.



위의 사진을 보면 특수 문자 처리를 위해 다소 복잡해 보인다. 스칼라에서는 아래와 같이 변경할 수 있다.



또한 따옴표 세 개를 이용해서 두줄의 문자열도 표현할 수가 있다.



하지만 결과를 보면 문자열 사이에 공백도 포함되는 것을 확인할 수 있다. 공백을 없애고 싶다면 문자열 시작 부분에 '|'를 기입해준 후 stripMargin 함수를 호출하면 된다.



비트 연산


스칼라에서의 비트 연산은 기존의 다른 프로그래밍 언어들과 비슷하다. 그 중 특이한게 있어서 리마인드 차원에서 남긴다.


스칼라의 비트 시프트 연산자는 (<<, >>) 가 있으며 추가로 (>>>) 연산자도 있다. >>, << 연산자는 기존의 비트 시프트 연산자와 같다. 예를 들어 아래와 같이 코드를 입력하면 값은 -1이 나온다.


-1 >> 31


-1은 이진 표현으로 11111111111111111111111111111111 이 되고 가장 왼쪽의 비트는 부호를 나타낸다. 이 상태에서 오른쪽 시프트를 시키면 모든 비트들이 하나씩 오른쪽으로 이동하고 가장 왼쪽의 부호 비트는 1로 채워진다. 결국 -1 >> 31 은 그대로 11111111111111111111111111111111 이 되는 것이다.


하지만 아래와 같이 입력하면 값이 0이 나온다.


-1 >>> 31


>>> 연산자는 부호 비트에 상관 없이 값을 0으로 채운다. 결국 00000000000000000000000000000001 값이 된다.



연산자 우선 순위


스칼라에서의 연산자는 매소드라고 언급했던 적이 있다. 그런데 이러한 연산자가 매소드임에도 그들 간에 우선 순위를 가지고 있다는게 참 신기했다.(구현하려고 머리꽤나 쓴 듯...)


스칼라에서느 매소드의 첫 글자를 보고 우선 순위를 결정한다. 예를 들어 매소드 이름이 '*'로 시작한다면 '*' 매소드는 '+'나 '-' 매소드보다 먼저 동작한다. (그냥 일반적인 연산자 우선 순위와 같다고 보면 될 것 같다.)


예외 사항이 하나가 있는데, x *= y + 1 이란 식이 있다고 가정하자. 이 식은 우선 순위가 어떻게 진행될까?

'*' 매소드가 먼저 진행될까??


결과는 그렇지 않다. 만약 '='로 끝나고 '<=', '>=', '==', '!=' 매소드가 아니라면 '='로 끝나는 매소드는 가장 마지막에 연산된다.

위의 식을 다시 보면 '*'는 '=' 매소드와 연결되어 있기 때문에 '+' 연산이 끝난 후에 '*'가 진행되고 '=' 매소드가 진행이 되는 것이다.


연산자 간의 우선 순위가 동등하면 스칼라에서는 어떤 매소드를 먼저 호출할까?


만약 매소드가 ':'로 끝난다면 오른쪽부터 연산을 진행하고 그렇지 않은 경우에는 왼쪽부터 연산을 진행 한다.


예를 들어 A ::: B ::: C 란 연산이 있다면 A ::: (B ::: C) 의 순서로 진행이 되고,

A * B * C 란 연산이 있을 경우에는 (A * B) * C 연산 순서로 계산이 진행된다.