567
15
장
스칼라 타입 시스템 II
scala
>
def printFoo
(
foo
:
Foo
.
type
)
=
println
(
foo
)
printFoo
:
(
foo
:
Foo
.
type
)
Unit
scala
>
printFoo
(
Foo
)
Foo says Hello
!
15.4
값에 대한 타입
모든 값에는 타입이 있다. 값 타입
value
type
이라는 말은 이런 타입이 취할 수 있는 모든 형태를
의미한다. 지금까지 살펴본 모든 타입이 이런 타입에 포함된다.
CAUTION
_
이번 절에서는 값 타입이라는 말을 ‘스칼라 언어 명세’의 용례에 따라 사용한다. 하지만 이 책
의 다른 곳에서는 더 일반적인 관례를 따라
AnyVal
의 모든 서브타입을 일컫는 말로 값 타입이라는 말을 사
용한다.
모든 것을 알려주자면, 값 타입에는 매개변수화한 타입, 싱글턴 타입, 타입 투영, 타입 지정자,
복합 타입, 존재 타입, 튜플 타입, 함수 타입, 그리고 중위 타입
infix
type
이 있다. 타입을 사용할
때 편하게 구문을 작성할 수 있게 해주는 마지막 세 가지 타입을 살펴보자. 또한 지금까지 다루지
않은 몇 가지 세부 사항도 살펴볼 것이다.
15.4.1
튜플 타입
스칼라에서
Tuple3
[
A
,
B
,
C
]
를
(
A
,
B
,
C
)
라고 쓸 수 있다는 사실은 이미 배웠다.
val t1
:
Tuple3
[
String
,
Int
,
Double
]
=
("
one
",
2
,
3
.
14
)
val t2
:
(
String
,
Int
,
Double
)
=
("
one
",
2
,
3
.
14
)
이러한 튜플 타입 표기를 사용하면 각괄호의 중복을 줄여서 더 복잡한 타입을 편하게 쓸 수 있
다. 게다가
TupleN
이 들어가지 않기 때문에 길이도 훨씬 짧아진다. 사실
TupleN
형태를 타입 시
568
3
부
기초를 넘어서
그니처에서 사용하는 일은 드물다.
List
[
Tuple2
[
Int
,
String
]]
과
List
[(
Int
,
String
)]
을 비
교해보면 이유는 분명하다.
15.4.2
함수 타입
함수의 타입은 화살표 표기를 사용해서 쓸 수 있다. 예를 들어
Function2
를 보자.
val f1
:
Function2
[
Int
,
Double
,
String
]
=
(
i
,
d
)
=
>
s
"
int
$
i
,
double
$
d
"
val f2
:
(
Int
,
Double
)
=
>
String
=
(
i
,
d
)
=
>
s
"
int
$
i
,
double
$
d
"
TupleN
구문으로 튜플의 타입을 지정하는 일이 드문 것처럼, 함수 타입을
FunctionN
구문으로
지정하는 경우도 드물다.
15.4.3
중위 타입
타입 매개변수가 두 개인 매개변수화한 타입은 중위 표기법으로 쓸 수 있다.
Either
[
A
,
B
]
를 사
용한 다음 예를 보자.
val left1
:
Either
[
String
,
Int
]
=
Left
("
hello
")
val left2
:
String Either Int
=
Left
("
hello
")
val right1
:
Either
[
String
,
Int
]
=
Right
(
1
)
val right2
:
String Either Int
=
Right
(
2
)
중위 타입을 내포시킬 수도 있다. 그런 경우 타입 이름이 콜론 (
:
)으로 끝나지 않는 한 왼쪽을
우선으로 결합된다.
:
으로 끝나는 타입은 오른쪽으로 결합된다. 이는 항에서와 동일하다 (항이
라는 용어를 강조하지는 않았지만, 타입이 아닌 모든 식을 항
term
이라고 부른다). 괄호를 사용
해서 기본적인 결합 순서를 변경할 수 있다.
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.