285
6
장
스칼라 함수형 프로그래밍
for
(
i
<
-
1 to 5
)
{
val even
=
isEven
((
1 to i
).
toList
).
result
println
(
s
"$
i is even
?
$
even
")
}
코드는 리스트가 끝날 때까지 각 리스트 원소를 처리하면서 서로 주고받는다.
isEven
안에서 리
스트의 끝을 만나면
true
를 반환한다.
isOdd
안에서 리스트의 끝을 만나면
false
를 반환한다.
이 스크립트를 실행하면 다음과 같이 예상과 일치하는 출력을 볼 수 있다.
1 is even
?
false
2 is even
?
true
3 is even
?
false
4 is even
?
true
5 is even
?
false
6.5
부분 적용 함수와 부분 함수
인자 목록이 둘 있는 간단한 메서드를 생각해보자.
//
src
/
main
/
scala
/
progscala2
/
fp
/
curry
/
curried
-
func
.
sc
scala
>
def cat1
(
s1
:
String
)(
s2
:
String
)
=
s1
+
s2
cat1
:
(
s1
:
String
)(
s2
:
String
)
String
첫 번째 문자열로 항상 ‘
Hello
’를 사용하는 특별한 버전이 필요하다고 가정하자. 부분 적용
partial
application
을 사용하면 그런 함수를 정의할 수 있다.
scala
>
val hello
=
cat1
("
Hello
")
_
hello
:
String
=
>
String
=
<
function1
>
scala
>
hello
("
World
!")
286
2
부
기본기 다지기
res0
:
String
=
Hello World
!
scala
>
cat1
("
Hello
")("
World
!")
res1
:
String
=
Hello World
!
REPL
은
hello
가 인자를 하나 받는 함수인
<
function1
>
이라는 사실을 알려준다.
우리는
cat1
에 첫 번째 인자 목록을 넘기면서, 그 뒤에 밑줄 (
_
)을 넣어서
hello
를 정의했다.
위 식에서 밑줄을 없애면 다음과 같은 오류를 볼 수 있다.
scala
>
val hello
=
cat1
("
Hello
")
>
console
<
:
8
:
error
:
missing arguments for method cat1
;
follow this method with
`
_
'
if you want to treat it as a
partially applied function
val hello
=
cat1
("
Hello
")
^
핵심 구절은 부분적으로 적용한 함수
partially
applied
function
다. 인자 목록이 둘 이상 있는 함수의
경우, 나중의 인자 목록을 몇 개 생략하면 새로운 함수를 정의할 수 있다. 즉, 필요한 인자 중 일
부만 적용하는 것이다. 잠재적인 모호성을 제거하기 위해 스칼라에서는 뒤에 밑줄을 추가해서
컴파일러에 부분 적용 함수를 원한다는 사실을 알려줘야 한다. 한 인자 목록 안에 있는 여러 인
자 중 뒤의 것을 생략한 뒤 나중에 이를 적용하는 것은 불가능하다. 부분 적용 기능은 오직 여러
인자 목록에 대해서만 적용 가능하다.
우리가
cat1
("
Hello
") ("
World
")
라고 쓸 때, 이는 마치 부분 적용
cat1
("
Hello
") _
를 시
작한 다음, 두 번째 인자 목록으로 추가 적용을 마치는 것처럼 보인다.
혼동할 수 있는 용어를 정리하자. 함수를 식에서 사용하되 필요한 모든 인자 목록을 제공하지는
않는 부분 적용 함수에 대해 방금 설명했다. 따라서 그런 식이 반환하는 함수는 나중에 나머지
인자 목록을 일부 또는 전부 전달받아서 적용해야 한다.
또한 우리는
2
.
4
절 ‘부분 함수’에서 부분 함수에 대해 살펴봤다. 부분 함수는 어떤 타임의 인자
를 하나만 받지만, 그 타입이 취할 수 있는 모든 값 중 일부에만 정의되어 있다는 사실을 기억하
라. 다음 예를 보자.
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.