디지털 양피지/Scala2015. 2. 13. 01:03

1. 변수

Scala에서는 변수를 선언할 때 var를 사용한다.

scala> var two = 1+1

two: Int = 2


scala> var name = "dellwon"

name: String = dellwon


scala> name = "test"

name: String = test

2 함수

함수를 만들때는 def를 사용한다.

scala> def three() = 1+2

three: ()Int


scala> three()

res18: Int = 3


scala> three

res19: Int = 3


3. 이름없는 함수

scala> (x: Int) => x + 1

res20: Int => Int = <function1>


scala> res20(2)

res21: Int = 3


이름 없는 함수를 사용하여 변수에 대입 할 수도 있다. 다음은 addOne이라는 변수에 함수를 대입한 것을 보여준다.

scala> var addOne = (x:Int) => x + 1

addOne: Int => Int = <function1>


scala> addOne(2)

res22: Int = 3 


함수가 길 경우 중괄호를 사용하여 함수를 둘러 쌀수도 있다.

scala> def timesTwo(i: Int):Int = {

     | println("Hello World")

     | i*2

     | }


이름 없는 함수도 다음과 같은 방식으로 사용할 수 있다.

scala> {i: Int => println("Hello World")

     | i*2

     | }

res24: Int => Int = <function1>


scala> res24(2)

Hello World

res25: Int = 4


4. 부분 적용(Partial Application) 함수

Scala에서는 "_" 를 사용하는 방법을 자주 볼 수 있다. 부분적용에서 "_" 는 그 부분만을 다시 이름 없는 매개 변수로 만들어 주는 것이다. 다음의 adder 함수는 두개의 변수를 가지지만 adder2 함수는 첫 번째 변수를 지정하고 두번째 변수를 "_"를 사용하여 남겨 놓아 새로운 함수를 만들어 사용한다.

scala> def adder(m: Int, n: Int) = {

     | m+n

     | }

adder: (m: Int, n: Int)Int


scala> var add2 = adder(2, _: Int)

add2: Int => Int = <function1>


scala> add2(3)

res26: Int = 5


5. Curried Function

Functional Programming 에서 주로 사용되는 기법으로 보인다. curring 또는 curried function에 대한 자세한 내용은 다음에 다르기로 하고 Scala에서 사용하는 방식을 보자.


먼저 multiply하는 함수는 2개의 인자를 가지는데 각각의 괄호를 사용하여 값을 받을 수 있도록 하고 있다. 이렇게 작성된 함수는 2개의 변수를 받을 수 있다. 그리고, 부분적용에서와 같이 비슷한 방법으로 사용할 수도 있다.

scala> def multiply(m: Int)(n: Int): Int = m*n

multiply: (m: Int)(n: Int)Int


scala> multiply(3)(2)

res27: Int = 6


scala> val timesTwo = multiply(2) _

timesTwo: Int => Int = <function1>


scala> timesTwo(3)

res28: Int = 6

timesTwon 변수에는 multiply에 첫번째 인자를 지정하고 두번째 인자는 "_"를 사용하여 다음에 값을 넣을 수 있도록 한다.


위와 같이 함수를 정의해 Partial Application을 만들지 않고 Curried 함수를 사용하여 값을 각각 대입할 수 있다.

scala> var test = (adder _).curried

test: Int => (Int => Int) = <function1>


scala> test(2)(3)

res30: Int = 5


scala> test(2)

res31: Int => Int = <function1>


scala> res31(3)

res32: Int = 5

첫번째 줄은 curried 메소드를 사용하여 adder 의 변수 두개를 모두 받을 수 있도록 만들었다. curried 된 함수는 Multiply같이 2개의 변수를 받을 수 있도록 만들어진다. 물론 위와 같은  방식으로 한 개의 변수만으로도 사용가능하다.


Posted by 빨간 양말