698
4
부
고급 주제 및 실전 응용
22.2
자바와 스칼라 제네릭스
지금까지
java
.
lang
.
String
과 같은 자바 타입을 스칼라 코드에서 사용해왔다. 심지어는 자바
의 컬렉션과 같은 제네릭 클래스를 스칼라에서 사용할 수도 있다.
스칼라의 매개변수화한 타입을 자바에서 사용하는 것은 어떨까?
scala
.
collection
.
mutable
.
LinkedHashMap
(
http
://
bit
.
ly
/
190DOMw
)과
scala
.
Option
(
http
://
bit
.
ly
/
12uGdb2
)을
사용하는 다음 제이유닛
4
테스트를 살펴보자. 이 예제는 여러분이 마주칠 수 있는 별난 상황 중
일부를 보여준다.
//
src
/
test
/
java
/
progscala2
/
javainterop
/
SMapTest
.
java
import org
.
junit
.*;
import org
.
junit
.
runner
.
RunWith
;
import org
.
junit
.
runners
.
JUnit4
;
import static org
.
junit
.
Assert
.*;
import scala
.*;
import scala
.
collection
.
mutable
.
LinkedHashMap
;
public class SMapTest extends org
.
scalatest
.
junit
.
JUnitSuite
{
//
➊
static class Name
{
public String firstName
;
public String lastName
;
public Name
(
String firstName
,
String lastName
)
{
this
.
firstName
=
firstName
;
this
.
lastName
=
lastName
;
}
}
LinkedHashMap
<
Integer
,
Name
>
map
;
@
Before
public void setup
()
{
map
=
new LinkedHashMap
<
Integer
,
Name
>
();
map
.
update
(
1
,
new Name
("
Dean
",
"
Wampler
"));
}
@
Test
public void usingMapGetWithOptionName
()
{
//
➋
assertEquals
(
1
,
map
.
size
());
699
22
장
자바 상호 운용성
Option
<
Name
>
n1
=
map
.
get
(
1
);
//
노트
:
Option
<
Name
>
assertTrue
(
n1
.
isDefined
());
assertEquals
("
Dean
",
n1
.
get
().
firstName
);
}
@
Test
public void usingMapGetWithOptionExistential
()
{
//
➌
assertEquals
(
1
,
map
.
size
());
Option
<
?
>
n1
=
map
.
get
(
1
);
//
노트
:
Option
<?>
assertTrue
(
n1
.
isDefined
());
assertEquals
("
Dean
",
((
Name
)
n1
.
get
()).
firstName
);
}
}
➊
JUnitSuite
를 혼합하면 이 제이유닛 테스트를 스칼라테스트
ScalaTest
로 실행한다.
➋ 타입을 지정한 값을 사용해서 테스트한다.
➌ 값에 대한 존재 타입을 사용해서 테스트한다.
스칼라의 튜플 타입을 사용할 수도 있다. 다만
("
someString
",
101
)
과 같은 스칼라의 구문적
인 이점은 살릴 수 없다.
//
src
/
test
/
java
/
progscala2
/
javainterop
/
ScalaTuples
.
java
package progscala2
.
javainterop
;
import scala
.
Tuple2
;
public class ScalaTuples
{
public static void main
(
String
[]
args
)
{
Tuple2 stringInteger
=
new Tuple2
<
String
,
Integer
>
("
one
",
2
);
System
.
out
.
println
(
stringInteger
);
}
}
하지만
FunctionN
타입을 자바에서 사용하는 것은 컴파일러가 자동으로 생성해주는 ‘감춰진’
멤버로 인해 차이가 아주 많다. 예를 들어 다음 코드를 컴파일하면 실패한다.
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.