스칼라

  1. 변수

이번엔 함수에 대해 알아보자.

def add(x: Int, y: Int): Int = {
  x + y
}

기본적인 함수 형태다. 흠
add 안에 있는건 파라미터고 그 밖에 Int는 리턴 타입이다.
int 파라미터를 두개를 받아서 int로 리턴하는거다.
일단 눈에 보이는건 return 이라는게 명시적으로 없다.
자동으로 마지막줄 실행 결과가 return 된다고 한다.
추론을 아주 열심히 하군.

저기서 생략 할 수 있는게 더 있다.
일단 리턴타입을 생략 가능하다.

def add(x: Int, y: Int) = {
  x + y
}

또한 메소드 바디의 { }를 제거 할 수 있다.

def add(x: Int, y: Int) =  x + y

와우!!

def main(args: Array[String]) {
  println(add(10,20))
}

한번 출력 해보자
다 잘된다.

한번 파라미터 타입도 생략해보자

def add(x, y) =  x + y

흠 안된다.
하지만 자바의 제네릭 처럼 어떠한 값도 상관 없다면 이런식으로 하면 된다.

def print(x : Any) = println(x)

호출 해보자 잘되나

print("hello")
print(999)

다음으론 익명함수를 살펴보자

(x:String) => println(x))("hello")

흠 감이 안잡히는 사람도 있을 것이다.

(() => print("hello"))()

이렇게 생각하면 조금 나을듯 하다.
웹 서버 개발자라면 2개의 언어를 무조건 알고 있다. 딱히 심도있게 배우지는 않았지만 그래도 어느정도는 아는게 자바스크립트다.
잘은 몰라도 어떻게 쓰는지는 아는? 그런정도?
자바스크립트에서 자주 사용하던 익명함수를 생각해보자

(function() {
    //...
}());

위의 스칼라 코드와 비슷하지 않은가?
그렇게 생각하면 조금더 빨리 와닿지 않을까 생각해 추가적으로 설명해놨다.

이번엔 약간 헷갈리는 _(언더바) 이다. 일단 코드부터보자

println((1 to 3).map(_ * 2))

일단 _(언더바)는 args 값이라고 한다.
흠…. map에는 한개의 파라미터가 존재하니까 _(언더바)가 하나 인거는 알겠다.

파라미터 값이라 했으니 일반 function에도 될듯 싶었다.
그래서 아까 만든 add 함수에 넣어봤다.

val add1 = add(_, 1)

일단 컴파일은 잘된다.
하지만 돌려보면 에러가 발생한다.

Error:(19, 20) missing parameter type for expanded function ((x$2) => add(x$2, 1))
    val add1 = add(_, 1)
                   ^

흠 저게 익명함수처럼 컴파일이 되네..
어찌됬건 _(언더바)의 타입이 없다고 하는 거 같다.
그래서 정의 해줘야된다.

val add1 = add(_: Int, 1)
println(add1(10))

그럼 제대로 나온다.
_(언더바)의 값을 알 수 없으니 다시 function을 리턴 하는 모양이다. 그래서 아래에서 다시 호출 하였다.

이번엔 자바8에서 흔히 쓰이는 익명함수다.

(1 to 3).map(i => i * 2).foreach(print)

자바랑 같기에 딱히 설명할 필요는 없는거 같다.

마지막으로 *

(1 to 3).map(2*).foreach(print)

흠 이거는 _ * 2 와 같다고 생각할 수 있다.

약간 새로운 문법들이 있어 낯설긴 하지만
재밌고 신기한 언어다.

흠 다음엔…뭘하지..
클래스와 오브젝트에 대해 알아보자!