680
4
고급 주제 및 실전 응용
21.1.2
scala
명령행 도구
scala
명령은 인자로 프로그램이 주어진 경우에는 프로그램을 실행하고, 그렇지 않은 경우에
REPL
시작한다. 또한
scalac
처럼 스크립트다. 다음과 같이
scala
시작할 있다.
scala
<
옵션
>
[
<
스크립트
|
클래스
|
객체
|
jar
>
<
인자
>
]
scalac
받아들이는 같은 옵션을 여기에 지정할 있다. 또한 [
21
-
4
]에 있는 옵션도 추가로
지정할 있다.
21-4
scala
명령의추가옵션
옵션 설명
-
howtorun
:
방법
object
,
script
,
jar
,
guess
중어떤방법으로실행할지지정한다(
guess
가기본값임) .
-
i
파일
REPL
을시작하기전에파일의내용을미리읽어들인다.
-
e
문자열 문자열을마치
REPL
에서입력한것처럼실행한다.
-
save
컴파일한스크립트를나중에사용할수있게
JAR
파일에저장한다.따라서재컴파일에드는부
가비용을줄일수있다.
-
nc
컴파일데몬인
fsc
를실행하지않는다.이옵션을지정하지않으면컴파일러를재시작하는데
드는부가비용을줄이기위해
fsc
를자동으로시작한다.
옵션이 아닌 첫 번째 인자가 실행할 프로그램으로 인식된다. 아무 실행 파일도 지정하지 않으면
REPL
시작한다. 프로그램을 지정한 경우, 프로그램 이름 뒤에 오는 모든 인자는
args
열을 통해 대상 프로그램에 전달된다. 앞에서 이미 그런 예를 많이 봤다.
-
howtorun
:
방법
옵션을 지정하지 않은 경우,
scala
대상 프로그램의 종류를 추론할 것이
다. 대상 파일이 스칼라 소스 코드라면
scala
는 그 대상을 스크립트로 실행한다. 만약 대상이
main
들어 있는 클래스 파일이거나 정상적인
Main
-
Class
지정된
JAR
파일이라면, 일반적
자바 프로그램과 마찬가지로 대상 파일을 실행한다.
-
i
파일
’ 옵션은 대화식 모드에서 원하는 스칼라 문을 입력하기 전에 대상 파일을 미리 읽어
이기 위해 사용한다. 일단
REPL
들어왔다면 ‘
:
load
파일이름
’을 사용해서 파일을 읽을 수
다. 이런 파일은 여러분이
REPL
시작할 때마다 동일한 명령을 반복해서 실행하는 경우에 유용
하다.
681
21
스칼라 도구와 라이브러리
REPL
을 사용하는 동안 몇 가지 명령을 쓸 수 있다.
:
help
를 입력하면 모든 명령의 목록을
단한 설명과 함께 있다. [표
21
-
5
]는 스칼라
2
.
11
.
2
에서 사용 가능한 명령을 보여준다.
용을 약간 편집했다.
21-5
스칼라
REPL
에서사용가능한명령
명령 설명
:
cp
경로
JAR
나디렉터리를
classpath
에추가한다.
:
edit
번호 또는 과거입력을편집한다.
:
help
[
명령] 이요약이나명령에따른구체적인도움말을표시한다.
:
history
[
개수
]
과거입력을표시한다( 선택적인개수는보여줄명령의개수다 ).
:
h
?
문자열 과거입력을검색한다.
:
imports
[
이름
...]
과거임포트내역을보여주며,이름이어디서왔는지식별해준다.
:
implicits
[
-
v
]
현재영역안의암시들을보여준다(
-
v
를선택하면더자세한출력을보여준다) .
:
javap
경로 또는 클래스 파일이나클래스를역어셈블한다.
:
line
번호 또는 지정한번호나줄을과거입력목록의맨뒤로보낸다.
:
load
경로 경로로주어진파일의내용을실행한다.
:
paste
[
-
raw
] [
경로
]
붙여넣기
paste
모드로들어가거나,경로에있는파일을붙여넣는다.
:
power
고급사용자모드로들어간다( 본문의설명을보라 ).
:
quit
인터프리터를종료한다(
Ctrl
-
D
도같은역할을한다) .
:
replay
실행을재설정하고,모든예전명령을재실행한다.
:
reset
REPL
을초기상태로재설정하고,모든세션엔트리를삭제한다.
:
save
경로 세션을나중에실행할수있도록파일에저장한다.
:
sh
명령 인자 셸명령을실행한다(결과는암시적으로
List
[
String
]
다).
:
settings
[
+
또는
-
]
옵션 컴파일러옵션플래그를사용가능하게만들거나(
+
)/불가능하게만든다(
-
).
:
silent
결과를자동으로출력하게하거나출력하지않게한다.
:
type
[
-
v
]
식을계산하지않고타입만표시한다.
:
kind
[
-
v
]
식의타입이속하는계
kind
를표시한다.
:
warnings
경고가발생한행중가장최근에발생한경고를보여준다.
:
power
모드로 활성화할 있는 고급 사용자 모드에서추상 구문 트리
abstract
syntax
tree
인터
프리터의 프로퍼티 메모리상의 데이터를 살펴보거나 컴파일러를 조작할 있는 추가 명령을
제공한다.
어떤 스크립트를 자주 사용하는 경우
scala
명령으로 스크립트를 실행하는 것이 지겨울 수
있다. 윈도우나 유닉스 종류의 시스템에서는
scala
스크립트
-
파일
-
이름
방식의 호출을 사용하
않아도 독립적으로 실행될 있는 스크립트를 만들 있다.
682
4
고급 주제 및 실전 응용
다음 예제는 유닉스 계열의 시스템에서 독립 실행 스크립트를 만드는 방법을 보여준다.
chmod
+
x
secho
같이 파일에 실행 권한을 부여해야 한다는 사실을 기억하라.
#!/
bin
/
sh
#
src
/
main
/
scala
/
progscala2
/
toolslibs
/
secho
exec scala
"$
0
"
"$
@
"
!#
print
("
You entered
:
")
args
.
toList foreach
{
s
=
>
printf
("%
s
",
s
)
}
println
다음은 실행 파일을 사용하는 방법을 보여준다.
$
secho Hello World
You entered
:
Hello World
마찬가지로 다음은 윈도우의
.
bat
명령을 보여준다.
::#!
@
echo off
call scala
%
0
%*
goto
:
eof
::!#
print
("
You entered
:
")
args
.
toList foreach
{
s
=
>
printf
("%
s
",
s
)
}
println
scalac
에 대
scala
의 한
소스 파일을
scala
실행하는 것은
scalac
컴파일하는 것과 비교할 가지 한계가 있다.
scala
실행할 스크립트 파일은 다음 예제와 같이 내용을 익명의 객체에 둘러싼 것과 비슷
하다.
683
21
스칼라 도구와 라이브러리
object Script
{
def main
(
args
:
Array
[
String
]):
Unit
=
{
new AnyRef
{
//
스크립트
코드가
여기에
들어간다
.
}
}
}
스칼라
object
에는 패키지 선언이 들어갈 수 없다. 이는 스크립트 안에서 패키지를 선언할
없다는 뜻이다. 책에서 패키지를 선언하는 예제는 반드시 컴파일해서 별도로 실행해야 하는
이유도 때문이다.
반대로, 올바른 스크립트인데
-
Xscript
객체
옵션을 사용하지 않으면
scalac
컴파일할
없는 것도 있다. 여기서
객체
컴파일할 객체의 이름이며, 앞의 예제에 있는
Script
대신한
다. 다른 말로 하면, 이 컴파일러 옵션은
REPL
암시적으로 만들어주는 것과 같은 래퍼를
든다.
타입의 밖에 함수 정의나 함수 호출이 위치할 없기 때문에, 컴파일을 하려면 래퍼 객체가
요하다. 다음 예제를
scala
사용해서 스크립트로 실행하는 경우에는 작동한다.
//
src
/
main
/
scala
/
progscala2
/
toolslibs
/
example
.
sc
case class Message
(
name
:
String
)
def printMessage
(
msg
:
Message
)
=
println
(
msg
)
printMessage
(
new Message
("
This works fine with the REPL
"))
하지만 스크립트를
scalac
-
Xscript
옵션 없이 컴파일하면 다음과 같은 오류가 발생한다.
example
.
sc
:
3
:
error
:
expected class or object definition
def printMessage
(
msg
:
Message
)
=
println
(
msg
)
^
example
.
sc
:
5
:
error
:
expected class or object definition
printMessage
(
new Message
("
This works fine with the REPL
"))
^
two errors found
684
4
고급 주제 및 실전 응용
대신 다음과 같이 컴파일해서 실행할 있다.
scalac
-
Xscript MessagePrinter src
/
main
/
scala
/
progscala2
/
toolslibs
/
example
.
sc
scala
-
classpath
.
MessagePrinter
스크립트는 결과적으로 기본 패키지를 사용하기 때문에, 만들어진 클래스 파일은 현재 디렉
터리에 들어 있을 것이다.
MessagePrinter
$$
anon
$
1
$
Message
$.
class
MessagePrinter
$$
anon
$
1
$
Message
.
class
MessagePrinter
$$
anon
$
1
.
class
MessagePrinter
$.
class
MessagePrinter
.
class
javap
-
private
를 사용해서(다음 절에서 설명할 것이다 ) 파일을 살펴보면 내부에 들어
선언을 있다.
-
p
또는
-
private
플래그는 비공개나 보호 멤버를 포함하는 모든 멤버를
표시하라는 의미다 (모든 옵션을 보고 싶다면
javap
-
help
사용하라 ).
.
class
빼고
javap
MessagePrinter
$$
anon
$
1
$
Message
$
처럼 호출해야 한다.
MessagePrinter
MessagePrinter
$
scalac
스크립트를 애플리케이션’으로 만들면서
진입점을 제공하기 위해 생성한 래퍼다.
MessagePrinter
에는 우리에게 필요한
static
main
들어 있다.
MessagePrinter
$$
anon
$
1
전체 스크립트를 감싸도록 생성된 자바 클래스다. 스크립트의
printMessage
메서드는 클래스의 비공개 메서드다.
MessagePrinter
$$
anon
$
1
$
Message
Message
클래스다.
MessagePrinter
$$
anon
$
1
$
Message
$
Message
동반 객체다.
21.1.3
scalap
javap
명령행 도구
스칼라 구성 요소들이
JVM
바이트 코드로 어떻게 구현되는지 이해하려 디컴파일러

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.