스칼라
- 변수
이번엔 함수에 대해 알아보자.
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 와 같다고 생각할 수 있다.
약간 새로운 문법들이 있어 낯설긴 하지만
재밌고 신기한 언어다.
흠 다음엔...뭘하지..
클래스와 오브젝트에 대해 알아보자!