201
4
패턴 매칭
scala
>
slide2
.
toList
res1
:
List
[
Seq
[
Int
]]
=
List
(
List
(
1
,
2
),
List
(
2
,
3
),
List
(
3
,
4
),
List
(
4
,
5
))
scala
>
seq
.
sliding
(
3
,
2
).
toList
res2
:
List
[
Seq
[
Int
]]
=
List
(
List
(
1
,
2
,
3
),
List
(
3
,
4
,
5
))
sliding
메서드 모두 반복자를 반환한다. 이는 반환값이 ‘지연값이어서 즉시 리스트의 복
사본을 만들지 않는다는 뜻이다. 그런 작업은 시퀀스가 길면 비용이 많이 있다.
toSeq
호출하면 반복자를 머리는 미리 계산해두되 꼬리는 필요할 때만 계산하는 지연 리스트인
collection
.
immutable
.
Stream
(
http
://
bit
.
ly
/
1q8XiTI
)으로 변환한다. 반대로,
toList
호출하면 전체 반복자를 즉시 계산해서 리스트를 만든다.
결과가 조금 다르다. 예를 들어 경우에는 마지막에
(
5
, _ )
없다.
4.7
가변 인자 목록과 일치시키기
2
.
6
타입 정보 추론하기에서 스칼라가 메서드의 가변 길이 인자 목록을 어떻게 지원하는지
설명했다. 예를 들어
SQL
작업하는 도구를 작성하는 중이고,
WHERE
foo
IN
(
val1
,
val2
,
... )
라는
SQL
조건절을 표현하는 케이스 클래스를 원한다고 가정하자 (예제는 오픈 소스가
아닌 실제 프로젝트에서 착상을 얻은 것이다). 다음은 그런 조건절에 들어갈 여러 값의 목록을
가변 인자 목록으로 처리하는 케이스 클래스 예제다. 코드에는
SQL
비교 연산자
OP
사용
하는
WHERE
x
OP
y
대한 다른 정의도 들어 있다.
//
src
/
main
/
scala
/
progscala2
/
patternmatching
/
match
-
vararglist
.
sc
//
WHERE
절에서
사용할
연산자들
object Op extends Enumeration
{
//
type Op
=
Value
val EQ
=
Value
("
=
")
val NE
=
Value
("!
=
")
val LTGT
=
Value
("
<>
")
val LT
=
Value
("
<
")
202
2
기본기 다지기
val LE
=
Value
("
<
=
")
val GT
=
Value
("
>
")
val GE
=
Value
("
>
=
")
}
import Op
.
_
//
SQL
WHERE x op value
절을
표현한다
.
//
+
op
+
=
,
!
=
,
<>
,
<
,
<
=
,
>
,
>
=
등의
비교
연산자다
.
case class WhereOp
[
T
](
columnName
:
String
,
op
:
Op
,
value
:
T
)
//
//
SQL
WHERE x IN
(
a
,
b
,
c
,
...)
절을
표현한다
.
case class WhereIn
[
T
](
columnName
:
String
,
val1
:
T
,
vals
:
T
*)
//
val wheres
=
Seq
(
//
WhereIn
("
state
",
"
IL
",
"
CA
",
"
VA
"),
WhereOp
("
state
",
EQ
,
"
IL
"),
WhereOp
("
name
",
EQ
,
"
Buck Trends
"),
WhereOp
("
age
",
GT
,
29
))
for
(
where
<
-
wheres
)
{
where match
{
case WhereIn
(
col
,
val1
,
vals
@
_
*)
=
>
//
val valStr
=
(
val1
+:
vals
).
mkString
(",
")
println
(
s
"
WHERE
$
col IN
($
valStr
)")
case WhereOp
(
col
,
op
,
value
)
=
>
println
(
s
"
WHERE
$
col
$
op
$
value
")
case
_
=
>
println
(
s
"
ERROR
:
Unknown expression
:
$
where
")
}
}
➊ 비교 연산자를 위한 열거형이다. 여기서는
SQL
의 연산자에 대한 문자열 표현을 ‘이름으로
열거값에 대입한다.
WHERE
x
OP
y
절을 위한 케이스 클래스다.
WHERE
x
IN
(
val1
,
val2
, ... )
절을 위한 케이스 클래스다.
구문분석할 예제 객체들이다.
가변 인자와 매치시키기 위한 구문인
@ _*
유의하라.
가변 인자 목록과 매치시키기 위한 패턴인
@ _*
그렇게 직관적이지는 않다. 이런 패턴이 필요
경우가 있을 것이다. 다음은 프로그램의 출력이다.

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.