141
3
기초를 튼튼히
아직 이 문법에 익숙하지 않다면, 문장 자체는 꽤 ‘분명해’ 보이는데도 대체 어떤 일이 벌어진
것인지 이해하기 어려울 있다. 다음은 마지막 줄을 점차 단순화한 과정을 보여준다. 가장
지막 줄은 원래 문장과 같다.
List
(
1
,
2
,
3
,
4
).
filter
((
i
:
Int
)
=
>
isEven
(
i
)).
foreach
((
i
:
Int
)
=
>
println
(
i
))
List
(
1
,
2
,
3
,
4
).
filter
(
i
=
>
isEven
(
i
)).
foreach
(
i
=
>
println
(
i
))
List
(
1
,
2
,
3
,
4
).
filter
(
isEven
).
foreach
(
println
)
List
(
1
,
2
,
3
,
4
)
filter isEven foreach println
줄이 명시적인 만큼 초보자가 이해하기는 쉽다. 하지만 컬렉션의
filter
인자를
하나만 받고,
foreach
는 컬렉션에 대해 암시적 루프 역할을 한다는 등의 내용을 기억한다면,
맨 마지막의 ‘간결한’ 구현을 훨씬 빠르게 읽고 이해할 있다. 다른 버전에는 여러분의
험이 축적됨에 따라 점점 더 방해물처럼 느껴지게 될 시각적 잡음이 들어 있다. 스칼라 코드를
읽는 법을 배워가면서 이를 염두에 두라.
식은 모든 메서드가 인자를 하나씩만 받으므로 작동한다. 만약 연쇄 호출의 중간에
자가 없거나 인자를 하나 이상 취하는 메서드를 사용하면, 컴파일러를 교란시킬 있다. 그런
경우에는 기호 일부 또는 전부를 원래대로 돌려놔야 한다.
3.3
우선순위 규칙
2
.
0
*
4
.
0
/
3
.
0
*
5
.
0
실제로는 여러
Double
대한 메서드 호출의 연속이라면, 연산자
선순위어떻게 될까? 다음은 가장 낮은 우선순위부터 가장 높은 우선순위까지 이들을 나열한
것이다.
1
. 모든 글자
2
.
|
3
.
^
4
.
&
5
.
< >
142
1
스칼라와의 만남
6
.
= !
7
.
:
8
.
+ -
9
.
* / %
10
. 다른 모든 특수 문자
같은 줄에 있는 문자는 같은 우선순위를 가진다. 예외는 대입에 사용하는 =이다. =을 대입에
사용하는 경우 가장 낮은 우선순위가 된다.
한편
*
/
우선순위는 같으므로 다음 줄은 똑같이 작동한다.
scala
>
2
.
0
*
4
.
0
/
3
.
0
*
5
.
0
res0
:
Double
=
13
.
333333333333332
scala
>
(((
2
.
0
*
4
.
0
)
/
3
.
0
)
*
5
.
0
)
res1
:
Double
=
13
.
333333333333332
왼쪽으로 결합하는
left
-
associative
메서드를 연속적으로 호출하는 경우, 이들은 왼쪽에서 오른쪽
순으로 묶인다. 다만 모든 메서드가 ‘왼쪽 결합’인 것은 아니다. 스칼라에서는 모든 메서드가
으로 묶이지만, 이름이 콜론 (
:
)으로 끝나는 메서드는 항상 오른쪽으로 묶인다. 예를 들어
List
::
메서드를 사용해서 원소를 맨 앞에 넣을 수 있다. 이를 ‘생성하다, 만들다’라는 뜻을
지닌 영어
constructor
’를 줄여 ‘콘즈
cons
라고 한다. 말은 리스프
Lisp
에서 유래했다.
scala
>
val list
=
List
('
b
',
'
c
',
'
d
')
list
:
List
[
Char
]
=
List
(
b
,
c
,
d
)
scala
>
'
a
'
::
list
res4
:
List
[
Char
]
=
List
(
a
,
b
,
c
,
d
)
여기서 번째 식은
list
.:: ('
a
')
같다.
TIP
메서드 이름이 :끝나면 오른쪽으로 묶이지 왼쪽으로 묶이지 않는다.

Get 프로그래밍 스칼라: 실용적인 스칼라 활용법을 익히는 가장 확실한 실전 바이블 (2.11.x 버전 기반) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.