카테고리 없음

scala 기본(함수)

머룽 2023. 4. 18. 12:31

스칼라

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