스칼라에서 익명 함수(Anonymous Function)는 다음과 같은 형태로 정의합니다.
// 이 함수의 타입은 하나의 Int형 매개변수를 받아 Int형으로 그 제곱을 리턴하는 Int => Int입니다.
(x: Int) => x * x
// 이 함수의 타입은 두 개의 Int형 매개변수를 받아 그 합을 Int를 리턴하는 (Int, Int) => Int입니다.
(x: Int, y: Int) => x + y
익명 함수는 타입을 가지는데요. 예를 들어 다음 코드의 doWithOneAndTwo
를 보면 (Int, Int) => (Int)
와 같은 타입의 익명 함수만 받아들입니다.
따라서 코드 13번째 줄과 같이 (x, y) => x + y
와 같은 익명 함수를 매개변수로 사용할 수 있습니다.
여기서 x와 y의 타입을 지정하지 않고 생략했는데요. 컴파일러가 코드 4번째 줄을 보고 타입을 알 수 있기 때문입니다.
추가로 더 짧게 변수명을 생략할 수도 있습니다. x와 y가 익명 함수의 Body에서 딱 한 번만 사용된다면 _
로 대체할 수 있는데요. 익명 함수의 Body에 나타나는 _
의 순서는 매개변수에 정의된 순서대로 입니다.
예를 들어 _ / _
는 x/y
와 같습니다.
하지만 만약 y/x
처럼 순서를 바꿔서 표현하고 싶으면 까다로워지는데요. (1/_)*_
라고 표현해야겠지요. (1/x)*y
는 y/x
이니까요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | object LearnScala { // 매개변수로 받은 익명함수에 1과 2를 넣어서 실행하는 메소드 def doWithOneAndTwo(f: (Int, Int) => Int) = { f(1, 2) //return은 생략되었지만, f(1, 2)의 결과가 return } def main(args: Array[String]): Unit = { // ① 명시적으로 타입을 선언하는 익명함수 val call1 = doWithOneAndTwo((x: Int, y: Int) => x + y) // ② 코드4번째 줄에서 익명함수의 매개변수 타입(Int, Int)을 이미 정했기 때문에 생략 val call2 = doWithOneAndTwo((x, y) => x + y) // ③ 이렇게 요약할 수도 있음 val call3 = doWithOneAndTwo(_ + _) // 매개변수의 순서대로 _에 대입됨 val call4 = doWithOneAndTwo((x:Int, y:Int)=> x*y) val call5 = doWithOneAndTwo((x,y)=>x-y) val call6 = doWithOneAndTwo(_ % _) println(call1, call2, call3, call4, call5, call6) } } | cs |
출력 〉 | (3,3,3,2,-1,1) |
'Scala' 카테고리의 다른 글
Part4 튜플) 튜플 (0) | 2019.02.23 |
---|---|
Part3 메소드와 함수) 익명함수2 (0) | 2019.02.22 |
Part3 메소드와 함수) 메소드 정의 (0) | 2019.02.22 |
Part2 편리한 스칼라) 문자열 다루기 (0) | 2019.02.21 |
Part2 편리한 스칼라) 숫자 다루기 (0) | 2019.02.21 |