88
1
부
스칼라와의 만남
scala
>
1
.
1f to 10
.
3f by 3
.
1f
//
Float
범위
,
증분이
1
이
아님
res4
:
scala
.
collection
.
immutable
.
NumericRange
[
Float
]
=
NumericRange
(
1
.
1
,
4
.
2
,
7
.
2999997
)
scala
>
1
.
1f to 10
.
3f by 0
.
5f
//
Float
범위
,
증분이
1
보다
작음
res5
:
scala
.
collection
.
immutable
.
NumericRange
[
Float
]
=
NumericRange
(
1
.
1
,
1
.
6
,
2
.
1
,
2
.
6
,
3
.
1
,
3
.
6
,
4
.
1
,
4
.
6
,
5
.
1
,
5
.
6
,
6
.
1
,
6
.
6
,
7
.
1
,
7
.
6
,
8
.
1
,
8
.
6
,
9
.
1
,
9
.
6
,
10
.
1
)
scala
>
1
.
1 to 10
.
3 by 3
.
1
//
Double
범위
res6
:
scala
.
collection
.
immutable
.
NumericRange
[
Double
]
=
NumericRange
(
1
.
1
,
4
.
2
,
7
.
300000000000001
)
scala
>
'
a
'
to
'
g
'
by 3
//
Char
범위
res7
:
scala
.
collection
.
immutable
.
NumericRange
[
Char
]
=
NumericRange
(
a
,
d
,
g
)
scala
>
BigInt
(
1
)
to BigInt
(
10
)
by 3
res8
:
scala
.
collection
.
immutable
.
NumericRange
[
BigInt
]
=
NumericRange
(
1
,
4
,
7
,
10
)
scala
>
BigDecimal
(
1
.
1
)
to BigDecimal
(
10
.
3
)
by 3
.
1
res9
:
scala
.
collection
.
immutable
.
NumericRange
.
Inclusive
[
scala
.
math
.
BigDecimal
]
=
NumericRange
(
1
.
1
,
4
.
2
,
7
.
3
)
2.4
부분 함수
부분 함수
PartialFunction
(
http
://
bit
.
ly
/
1yMpzEP
)의 특성을 알아보자. 부분 함수에서 부분이란
말은 함수가 모든 가능한 입력에 대해 결과를 정의하지는 않는다는 뜻이다. 지정한 케이스 절에
서 어느 하나와 일치하는 입력에 대해서만 결과를 정의한다.
부분 함수 안에는 케이스 절만 들어갈 수 있고 반드시 전체를 중괄호로 묶어야 한다. 반면 ‘일
반적’ 함수 리터럴은 중괄호뿐 아니라 괄호로도 본문 식을 묶을 수 있다.
케이스 절의 하나와 일치하지 않는 값이 부분 함수의 인자로 들어오면
MatchError
(
http
://
bit
.
ly
/
1DDkcsB
) 실행 시점 예외가 발생한다.
부분 함수, 즉
PartialFunction
이 어떤 입력과 일치하는지는
isDefinedAt
메서드를 호출해
서 알 수 있다. 이 메서드를 사용해서
MatchError
예외를 발생시킬 위험을 없앨 수 있다.
89
2
장
입력은 조금만, 일은 더 많이
pf1
orElse
pf2
orElse
pf3
...
등과 같이
PartialFunction
을 여럿 ‘연쇄 호출’할 수 있
다.
pf1
과 일치하지 않으면
pf2
를 시도하고,
pf2
가 실패하면 또
pf3
를 시도하는 식이다.
MatchError
는 모든 부분 함수가 입력과 일치하지 않는 경우에 발생한다.
다음 예제는 이를 보여준다.
//
src
/
main
/
scala
/
progscala2
/
typelessdomore
/
partial
-
functions
.
sc
val pf1
:
PartialFunction
[
Any
,
String
]
=
{
case s
:
String
=
>
"
YES
"
}
//
➊
val pf2
:
PartialFunction
[
Any
,
String
]
=
{
case d
:
Double
=
>
"
YES
"
}
//
➋
val pf
=
pf1 orElse pf2
//
➌
def tryPF
(
x
:
Any
,
f
:
PartialFunction
[
Any
,
String
]):
String
=
//
➍
try
{
f
(
x
).
toString
}
catch
{
case
_
:
MatchError
=
>
"
ERROR
!"
}
def d
(
x
:
Any
,
f
:
PartialFunction
[
Any
,
String
])
=
//
➎
f
.
isDefinedAt
(
x
).
toString
println
("
|
pf1
-
String
|
pf2
-
Double
|
pf
-
All
")
//
➏
println
("
x
|
def
?
|
pf1
(
x
)
|
def
?
|
pf2
(
x
)
|
def
?
|
pf
(
x
)")
println
("+++++++++++++++++++++++++++++++++++++++++++++++++++++++")
List
("
str
",
3
.
14
,
10
)
foreach
{
x
=
>
printf
("%
-
5s
|
%
-
5s
|
%
-
6s
|
%
-
5s
|
%
-
6s
|
%
-
5s
|
%
-
6s
\
n
",
x
.
toString
,
d
(
x
,
pf1
),
tryPF
(
x
,
pf1
),
d
(
x
,
pf2
),
tryPF
(
x
,
pf2
),
d
(
x
,
pf
),
tryPF
(
x
,
pf
))
}
➊ 문자열과만 일치하는 부분 함수
➋ 더블과만 일치하는 부분 함수
➌ 두 함수를 묶어서 문자열과 더블 모두에 일치하는 새 부분 함수를 만듦
➍ 부분 함수를 호출하고 발생하는
MatchError
를 잡아내는 함수. 성공 여부와 관계없이 문자
열 반환
➎
isDefinedAt
을 호출해서 문자열 결과를 반환하는 함수
➏ 여러 조합을 시도해서 결과를 표로 출력
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.