ABOUT ME

-

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

    댓글

Designed by Tistory.