501
12
장
스칼라 컬렉션 라이브러리
창을 막는다. 한 클래스는 기본적인 값을 위한 것이며, 다른 하나는 참조(예를 들면
AnyRef
)
값을 위한 것이다. 기본 타입 버전은
8
바이트면 모든 기본 타입을 저장하기에 충분하다는 사실
을 활용한다. 이
8
바이트를 어떻게 해석할지에 대해 알려주는 ‘꼬리표’가 들어 있다.
그러므로 미니박싱은 꼬리표가 붙은 공용체
tagged
union
역할을 한다.
1
따라서 각각의 기본 타입
에 대한 별도의 인스턴스를 만들 필요가 없다. 참조값에 대한 클래스는 원래와 마찬가지로 작동
한다.
원래 컨테이너를 트레이트로 바꿈으로써 기존의 상속 관계는 두 클래스 인스턴스에서도 유효
하다. 예를 들어 매개변수화한 타입
class
C
[
T
]
와
class
D
[
T
]
가 있는데,
class
D
[
T
]
extends
C
[
T
]
였다고 하자. 그리고 그 둘을 모두 특화했다고 하자. 그러면 만들어진 코드는 개념적으로
다음과 비슷하다.
trait C
[
T
]
//
원래는
class C
[
T
]
class C
_
primitive
[
T
]
extends C
[
T
]
//
T
는
AnyVal
class C
_
anyref
[
T
]
extends C
[
T
]
//
T
는
AnyRef
trait D
[
T
]
extends C
[
T
]
//
원래는
class D
[
T
]
class D
_
primitive
[
T
]
extends C
_
primitive
[
T
]
with D
[
T
]
//
T
는
AnyVal
class D
_
anyref
[
T
]
extends C
_
anyref
[
T
]
with D
[
T
]
//
T
는
AnyRef
한편 성능이 필요한 경우 원한다면
@
specialized
를 여전히 사용할 수 있다. 다만 추가로 늘어나
는 용량에 주의하고, 앞에서 설명한 여러 설계상 단점을 염두에 두어야 한다.
12.5
마치며
이제 스칼라 컬렉션 라이브러리에 대한 공부를 마무리한다. 여기서는 변경 가능, 변경 불가능,
그리고 병렬 컬렉션 사이의 차이와, 자바 컬렉션에서 스칼라 컬렉션으로, 그리고 그 반대로 변
1
역주_ 꼬리표가붙은공용체로유명한것은
C
의
union
과(다만
C
에서
union
은여러구조체가같은메모리를사용하도록묶어주는역
할만하고,타입을구분하기위한태그는프로그래머가직접붙여야한다)파스칼등의가변레코드(
variant
record
)가있다.가변레코드
는타입정의시태그도함께정의하기때문에
C
와달리컴파일러가태그값을검사할수있다는장점이있다.
502
2
부
기본기 다지기
환하는 방법, 그리고 중요하지만 아직 완전히 해결하지는 못한
JVM
기본 타입에 대해 박싱의
부가 비용을 피하고 효율적으로 작동하는 컬렉션을 만드는 방법에 대해 정리했다.
스칼라 타입 시스템이라는 중요한 주제를 다루기 전에, 다음 장에서는 우리가 매일매일 ‘신경
쓰는’ 주제는 아니지만 꼭 알아야 하는 내용인, 스칼라가 가시성
visibility
을 미세하게 다룰 수 있도
록 어떤 지원을 하는지 다룰 것이다. 스칼라는 자바의
public
,
protected
,
private
, 그리고 기
본인 패키지 영역 기능을 훨씬 넘어서는 제어를 제공한다.
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.