대용량 분산처리 분석시스템인 스파크(Spark)를 알기 위해 항상 마주쳤던,
그리고 발목을 잡는것이 스칼라(Scala)이었다.
스파크를 제대로 이용하기 위해선 스크립팅 기술이 필요한데 가장 대중적인
것이 스칼라이고 그다음이 파이썬(Python) 인 듯 보인다.
파이썬으로 해도 되지만 스파크의 철학을 제대로 물려받아 활용하기 위해선
스칼라를 이용할 것을 많은 곳에서 권장했다.
스파크에 관련된 구글링 검색만을 해보아도 예제의 코드는 스칼라코드가 더
많이 검색되었고, 이러한 이유가 분명 있을 것이기에 스칼라 공부를
시작했다.
첫 공부의 시작에 앞서 책한권은 있어야 마음가짐이 잘 잡힐 것인데
필자는 아래의 책이 스칼라를 공부하기 위한 첫 책이다.
본 글에선 스칼라 설치와 “Hello world” 의 출력정도의 기본적인
것을 정리하는 걸 목표로 한다.
(단 앞으로의 내용은 Unix 계열 머신을 기준으로 설명함을 알립니다.)
스칼라 설치
스칼라는 수동으로 설치하는 방법과 자동으로 설치하는 방법으로 나뉜다.
수동설치
스칼라를 배포하는 scala-lang.org 를 들어가면
다운로드 페이지가 있다.
scala-2.XX.X.tgz
를 다운로드 한 이후 bin
폴더를 경로에 추가하면 되겠다.
자동설치
수동설치가 번거로우면 패키지 매니저를 이용해 설치하면 된다.
OSX 에선 Homebrew 를 통해 Homebrew 설치법은
생활코딩 참고
brew install scala
리눅스에선 apt-get
apt-get install scala
혹은 yum 을 통해
yum install scala
스칼라 설치가 가능하다.
수동설치 혹은 자동설치가 성공했다면 명령줄에서scala
명령어를 통해 실행 가능하다.
위의 예제는 스칼라에서 println()
함수로 “Hello world” 를
출력하는 예제이다.
터미널 상에서 스칼라를 쓰기에는 많은 불편함이 있을 것이다.
적당한 텍스트 에디터에 REPL(Read Evaluate Print Loop) 을 연동시켜
사용하거나, 적절한 IDE(ntegrated Development Environment) 를 이용하는
것이 여러모로 이점이 많겠다.
이부분은 개인취향이므로 무언가를 추천하지는 않겠지만 필자는 Sublime text 3 의 SublimeREPL
패키지를 사용해서 스칼라 스크립트를 작성하고 이 글을 작성함을
밝힌다.
값 할당
스칼라의 값 할당 방법은 다음과 같은 구문으로 약속되어 있다.
val <식별자>[: <타입>] = <데이터>
값(value) 의 앞글자 “val” 로 시작하고 식별자 다음에 데이터 타입을
명시하기 위해 :
로 구분한다.
그다음 할당할 데이터를 =
이후에 입력한다.
val x: Int = 2
val y: Int = 3
* y x
데이터 타입을 항상 명시해야 하는 것은 아니다.
데이터 타입을 입력하지 않을 경우 타입추론에 의해 자동으로 적당한 타입을
판단하여 실행한다.
val x = 4
val y = 5
* y x
데이터 타입을 정수(Int)형으로 명시하지 않았음에도 불구하고
x
, y
를 정수형으로 정의한 것을 확인할 수
있다.
res
변수
스칼라에선 “res” 그 뒤에 순차적으로 매겨지는 번호와 결합된 변수를
만들어 결과값 정보를 담는다.
이 특징을 이용하여 이전에 계산되었던 값을 불러와 재사용할 수 있을
것이다.
1 + 2 + 3
4 + 5 + 6
* res1 res0
Boolean
스칼라의 Boolean 타입은 true
, false
값을
이용한다.
100 > 10
100 < 10
100 == 10
100 == 100
Tuple
튜풀은 데이터를 담는 컨테이너 중에서 순서가 있고 복수개의 값들을 담는
컨테이너를 의미한다.
소괄호를 이용하면 데이터 타입을 명시하지 않고도 튜플을 만들 수 있다.
val tuple = (1, 2, 3, 4.0, "Five")
튜플에 들어가는 각 원소들은 그 원소들끼리의 데이터타입이 통일될
필요는 없다.
위의 예제처럼 Int, Double, String 3개의 각기다른 데이터타입이 튜플이라는
컨테이너에 담을 수 있다.
표현식 블록
실행시킬 복수줄의 코드단위를 중괄호로 묶어 하나의
표현식(expression)으로 관리하는것이 스칼라에선 가능하다.
그리고 복잡한 표현식을 실행시킨 결과를 반환값으로 사용할 수 있다.
val result = {
val x: Double = 100
* 0.5
x }
주석
스칼라에서 주석은 //
을 이용한다.
// println("Comment")
println("Not comment")
주석이 처리된 코드는 실행되지 않는 것을 확인할 수 있다.
매치표현식을 이용한 조건부 로직
스칼라에선 if else 구문의 조건문보다 매치표현식을 이용한 조건문을 즐겨 사용한다고 한다.
val today = "Tue"
if (today == "Mon") println("Weekday") else if (today == "Tue") println("Weekday") else if (today == "Wed") println("Weekday") else if (today == "Thu") println("Weekday") else if (today == "Fri") println("Weekday") else if (today == "Sat") println("Weekend") else if (today == "Sun") println("Weekend")
위의 if else 구문 코드는 today
요일이 언제인지에 따라
“Weekday”, “Weekend” 로 주중인지 주말인지를 출력한다.
매치표현식을 이용해본 코드는
val today = "Tue"
match {
today case "Mon" | "Tue" | "Wed" | "Thu" | "Fri" => "Weekday"
case "Sat" | "Sun" => "Weekend"
}
match
, case
를 통해 간결해 진 코드를 볼 때
if else 구문이 상당히 조악하게 보여졌다.
for loop
반복문 for loop 역시 스칼라에서 지원되며 강력한 기능들을 더할 수
있었다.
기본적인 사용법은 아래 구문 형태를 이용한다.
for (<식별자> <- <반복범위>) <표현식>
혹은
for {<식별자> <- <반복범위>} <표현식>
아래는 for 문을 이용하여 “Day1)” 부터 “Day10)” 까지 10개의 날을 출력하는 예제코드이다.
for {x <- 1 to 10} print("Day" + x + ") ")
Nested for loop
for 반복문을 중첩시키는 예제의 경우 스칼라에선 세련된 방법이 있다.
for {x <- 1 to 3}{
for {y <- 4 to 5}{
println(x * y)
}
}
위의 예제는 for문 안에 for문이 중첩하여 여섯경우의 곱 결과를
보여준다.
그런데 이것을 아래와 같이 간단하게 코딩을 줄이는것이 가능하다.
for {x <- 1 to 3; y <- 4 to 5} println(x * y)
두 반복자를 ;
를 이용해 for 문에 한꺼번에 입력하거나
for {x <- 1 to 3
<- 4 to 5} println(x * y) y
문단을 나누어도 되겠다.