438
2
부
기본기 다지기
잘못된 인자에 대해 예외를 던지지 않았다. 하지만
sbt
는 우리가
exit
를 호출했다는 것을 맘에
들지 않아 한다.
10.4
Product
, 케이스 클래스, 튜플
여러분의 케이스 클래스에
scala
.
Product
(
http
://
bit
.
ly
/
1voMO4r
)를 혼합할 수 있다. 그 트
레이트는 인스턴스의 필드에 작용할 수 있는 일반적인 메서드를 몇 가지 제공한다. 여기서는 예
제로
Person
인스턴스를 사용한다.
scala
>
case class Person
(
name
:
String
,
age
:
Int
)
defined class Person
scala
>
val p
:
Product
=
Person
("
Dean
",
29
)
p
:
Product
=
Person
(
Dean
,
29
)
//
이
케이스
클래스
인스턴스를
Product
타입의
변수에
대입할
수
있다
.
scala
>
p
.
productArity
//
필드의
개수
res0
:
Int
=
2
scala
>
p
.
productElement
(
0
)
//
원소
중
0
번째에
있는
값
(
0
이
첫
번째
)
res1
:
Any
=
Dean
scala
>
p
.
productElement
(
1
)
res1
:
Any
=
29
scala
>
p
.
productIterator foreach println
Dean
29
필드에 접근할 수 있는 일반적인 방법이 있으면 유용하기는 하지만, 그 가치는 필드의 타입이 실
제 타입이 아니라
Any
라는 점 때문에 제한된다.
또한
22
개까지의 구체적 필드
specific
field
개수에 대한
Product
의 서브타입이 있다 (예를 들
어
scala
.
Product2
(
http
://
bit
.
ly
/
1zmsjMe
)는 원소가 두 개인 프로덕트다 ). 이런 타입들
은 특정 필드를 선택하기 위한 메서드를 추가하며, 올바른 타입 정보를 유지해준다. 예를 들어
Product2
[+
T1
,+
T2
]
에는 다음과 같은 메서드가 추가된다.
439
10
장
스칼라 객체 시스템 I
package scala
trait Product2
[+
T1
,
+
T2
]
extends Product
{
abstract def
_
1
:
T1
abstract def
_
2
:
T2
...
}
이런 메서드는 필드의 실제 타입을 반환한다. 타입 매개변수는 공변적이다. 왜냐하면
ProductN
트레이트는 오직 변경 불가능한 타입에만 사용할 수 있고,
_
1
과 같은 메서드를 사용해서 그런
타입의 필드를 읽는 것은 대응하는 타입 매개변수
T1
을 공변적인 위치에서 사용하는 것과 같기
때문이다 (즉, 오직 반환값으로만 사용한다 ).
이런 메서드가 튜플의 원소에 접근하는 것과 같은 이름을 사용한다는 점을 기억하라. 실제로 모
든
TupleN
타입은 대응하는
ProductN
트레이트를 확장하면서
_
1
부터
_
N
까지의 구체적 메서드
를 제공한다. 여기서
_
N
은
1
이상
22
이하다.
scala
>
val t2
=
("
Dean
",
29
)
t2
:
(
String
,
Int
)
=
(
Dean
,
29
)
scala
>
t2
.
_
1
res0
:
String
=
Dean
scala
>
t2
.
_
2
res2
:
Int
=
29
scala
>
t2
.
_
3
<
console
>
:
36
:
error
:
value
_
3 is not a member of
(
String
,
Int
)
t2
.
_
3
^
Tuple2
에는 세 번째 원소나
_
3
이 없다.
왜 최대
22
개까지로 제한했을까?
22
는 실제로는 약간 임의로 선택한 값이지만, 어쨌든 튜플의
원소 개수가
22
개면 충분하고도 남는다는 것을 납득시킬 수 있을 것이다.
인간이 이해하기에는
22
개가 너무 많다. 하지만 불행히도 이런 한계를 넘어서야 유용한 경우
가 존재한다. 커다란 데이터베이스 ‘레코드’의 필드 (또는 컬럼)를 저장해야 하는 경우가 한 예
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.