123
2
입력은 조금만, 일은 더 많이
2.10
봉인된 클래스 계층
이번에는
Option
클래스를 통해 알 수 있는 스칼라의 유용한 디자인적 특징에 대해 살펴보자.
Option
핵심 내용은 가능한 서브타입이 둘뿐이라는 점이다. 어떤 값이 존재하는 경우에는
case
클래스
Some
, 그렇지 않은 경우에는
case
클래스
None
이다.
Option
에는 이상의 서브
타입이 존재하지 않는다. 따라서 사용자가 자신만의 서브클래스를 만들지 못하도록 방지할 수
있다면 정말 좋을 것이다.
스칼라는 이런 목적의 키워드로
sealed
제공한다.
Option
정의는 아래와 같다 (일부
).
sealed abstract class Option[+A] ... { ... }
sealed
키워드는 모든 서브클래스가 같은 소스 파일 안에 선언되어야 한다고 컴파일러에 알려
준다.
Some
None
스칼라 라이브러리에서
Option
정의된 파일에 함께 들어 있다. 기법
결과적으로
Option
서브타입을 추가하지 못하도록 막는다.
그밖에 사용자가 서브타입을 만들지 못하도록 막고 싶다면, 특정 타입을
final
정의할 수도
있다.
2.11
파일과 이름공간으로 코드 구조화하기
스칼라는 이름공간
namespace
package
사용하는 자바의 개념을 도입했지만, 그보다
유연성을 제공한다. 파일 이름은 타입 이름과 일치할 필요가 없고, 패키지 구조는 디렉터리
구조와 일치할 필요가 없다. 따라서 여러분은 패키지를 실제 물리적
physical
위치와 무관하게
의할 있다.
다음 예제는 전통적인 자바 구문을 사용해서
com
.
example
.
mypkg
라는 패키지 안에
MyClass
클래스를 정의한다.
124
1
스칼라와의 만남
//
src
/
main
/
scala
/
progscala2
/
typelessdomore
/
package
-
example1
.
scala
package com
.
example
.
mypkg
class MyClass
{
//
...
}
스칼라는 패키지 영역을 선언하기 위해 블록 구조의 구문을 사용하도록 지원한다. 이는
C
#의
namespace
구문이나 루비에서
modules
이름공간에 사용하는 것과 비슷하다.
//
src
/
main
/
scala
/
progscala2
/
typelessdomore
/
package
-
example2
.
scala
package com
{
package example
{
package pkg1
{
class Class11
{
def m
=
"
m11
"
}
class Class12
{
def m
=
"
m12
"
}
}
package pkg2
{
class Class21
{
def m
=
"
m21
"
def makeClass11
=
{
new pkg1
.
Class11
}
def makeClass12
=
{
new pkg1
.
Class12
}
}
}
package pkg3
.
pkg31
.
pkg311
{
class Class311
{
def m
=
"
m21
"
}
}
125
2
입력은 조금만, 일은 더 많이
}
}
pkg1
pkg2
라는 두 패키지를
com
.
example
패키지 아래에 정의했다. 이들 두 패키지 내부에
모두 세 가지 클래스를 정의했다.
Class21
안에 있는
makeClass11
makeClass12
메서드
형제’ 패키지인
pkg1
안에 있는 타입을 어떻게 참조할 있는지 보여준다. 또한 전체 경로인
com
.
example
.
pkg1
.
Class11
com
.
example
.
pkg1
.
Class12
사용해서 클래스를 참조할
수도 있다.
pkg3
.
pkg31
.
pkg311
문장 안에서 여러 패키지를 ‘연쇄
chain
있음을 보여준다. 패키
지에 대해 별도의
package
문을 사용할 필요는 없다.
하지만 별도로 패키지 문을 사용해야 하는 경우도 있다. 이를 연속 패키지 관용구라고 부르
겠다.
//
src
/
main
/
scala
/
progscala2
/
typelessdomore
/
package
-
example3
.
scala
//
example
있는
모든
패키지
수준의
선언을
영역으로
가져온다
.
package com
.
example
//
mypkg
있는
모든
패키지
수준의
선언을
영역으로
가져온다
.
package mypkg
class MyPkgClass
{
//
...
}
현재 영역으로 가져오고 싶은 여러 부모 패키지에 있는 타입 등의 패키지 수준의 선언이 있다
면, 앞에서 본 패키지 계층구조의 각 수준에서처럼 각각에 대해 별도의 패키지 문을 사용하라.
각 패키지 문은, 예전에 본 블록 구조의 구문과 마찬가지로 직전에 지정한 패키지의 하위패키
지로 해석된다. 문장은 절대 경로로 해석된다.
자바의 관례를 따라서 스칼라 라이브러리 클래스의 최상위 패키지는
scala
다.
이런 패키지 선언 구문이 유연하기는 하지만, 가지 제약 사항은 클래스나 객체 안에서는 패키
지를 정의할 없다는 것이다. 그런 식으로 선언하는 것은 어쨌든 그리 타당하지 않다.

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.