Lovetoken

저는 개발 취향을 가진 데이터 분석가 Jr. 입니다.

Navigation
 » Home
 » About Me
 » Github

Hello Scala! (스칼라 시작하기)

06 Jun 2017 » Scala



대용량 분산처리 분석시스템인 스파크(Spark)를 알기 위해 항상 마주쳤던, 그리고 발목을 잡는것이 스칼라(Scala)이었다.
스파크를 제대로 이용하기 위해선 스크립팅 기술이 필요한데 가장 대중적인 것이 스칼라이고 그다음이 파이썬(Python) 인 듯 보인다.
파이썬으로 해도 되지만 스파크의 철학을 제대로 물려받아 활용하기 위해선 스칼라를 이용할 것을 많은 곳에서 권장했다.
스파크에 관련된 구글링 검색만을 해보아도 예제의 코드는 스칼라코드가 더 많이 검색되었고, 이러한 이유가 분명 있을 것이기에 스칼라 공부를 시작했다.

첫 공부의 시작에 앞서 책한권은 있어야 마음가짐이 잘 잡힐 것인데
필자는 아래의 책이 스칼라를 공부하기 위한 첫 책이다.





러닝 스칼라 - 제이슨 스와츠 지음 | 김정인, 강성용 옮김 | 제이펍 | 2017년 04월 17일 출간



본 글에선 스칼라 설치와 “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 3SublimeREPL 패키지를 사용해서 스칼라 스크립트를 작성하고 이 글을 작성함을 밝힌다.



값 할당

스칼라의 값 할당 방법은 다음과 같은 구문으로 약속되어 있다.

val <식별자>[: <타입>] = <데이터>

값(value) 의 앞글자 “val” 로 시작하고 식별자 다음에 데이터 타입을 명시하기 위해 : 로 구분한다.
그다음 할당할 데이터를 = 이후에 입력한다.

val x: Int = 2
val y: Int = 3
x * y

데이터 타입을 항상 명시해야 하는 것은 아니다.
데이터 타입을 입력하지 않을 경우 타입추론에 의해 자동으로 적당한 타입을 판단하여 실행한다.

val x = 4
val y = 5
x * y

데이터 타입을 정수(Int)형으로 명시하지 않았음에도 불구하고 x, y 를 정수형으로 정의한 것을 확인할 수 있다.



res 변수

스칼라에선 “res” 그 뒤에 순차적으로 매겨지는 번호와 결합된 변수를 만들어 결과값 정보를 담는다.
이 특징을 이용하여 이전에 계산되었던 값을 불러와 재사용할 수 있을 것이다.

1 + 2 + 3
4 + 5 + 6
res0 * res1



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
  x * 0.5
}



주석

스칼라에서 주석은 // 을 이용한다.

// 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"

today match {
  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
     y <- 4 to 5} println(x * y)

문단을 나누어도 되겠다.