(스칼라) 함수

* 왜 함수형 언어인가?


함수형 프로그래밍인 스칼라에서는 함수 자체를 전달하고 반환받을 수 있습니다.
자바에서의 함수는 함수 객체가 아니라 클래스에 속한 메소드입니다.
스칼라에서 함수는 필요하다면 언제든지 => 로 표현되는 식을 통해 객체처럼 행동할 수 있습니다.

스칼라의 정의는 scalable에서 왓으며 확장이 쉽다는 이야기이다
즉, 잘 사용한다면 아주 동시성이 강한 언어이다.



1. 함수 정의

def 함수명 ([매개변수]): [반환자료형] {
  //구현할 로직
}


스칼라에서는 반환값이 없을 때 생략이 가능하다.

object class Ex_5_1 {
  def main(args:Array[String]) = {
    println("반환받은 값 : " + name());
  }

  def name() = {
    var a = 10
   a
  }
}



위의 def함수는 반환형을 명시적으로 쓰지 않아도 반환합니다.
명시적으로 반환형을 명시 할 수 있습니다.

def name() : Int = {
  val a = 10
  return a;
}

이렇게하면 Int형이 아닌 다른 자료형을 반환하려 한다면 컴파일 에러가 납니다.


<Call-By-Name 함수>


보통 함수는 두 가지 형태로 호출할 수 있습니다.
CALL-BY_VALUE (값으로 호출), CALL-BY-NAME(이름으로 호출)

CALL-BY-VALUE는 그동안 많이 봐왔던 형식입니다.
예를들어, a(b(x))처럼 중첩된 형태로 함수를 호출하면 안쪽의 함수 b가 반환하는 값이 다시 a에 들어가는 식으로 집어넣어지는 식으로 코드가 동작합니다.

CALL-BY-NAME은 b자체가 a의 인수로 들어간다고 생각하면 됩니다. b를 거쳐 나온 값이 아닌, b라는 함수 자체를 매개변수로 인정하는 것입니다.


예)
dropship(people(5))

인 것이 존재할 때, people함수가 끝나고 반환한 값이 dropship에 들어가는 것이 아니라
dropship이 실행되다가 특정한 값이 필요할 때 people함수를 사용할 수 있다.

def people(n: Int) = {
  println("탑승 수속을 시작합니다.")
  n
}

def dropship(n: => Int) = {
  println(" 드랍쉽 준비합니다.")
  println(n + "명 탑승했습니다.")
}
}

스칼라에서 CALL-BY-NAME이 호출되는 함수는, 호출하는 함수가 매개변수를 필요로 할떄마다 계속 부름을 당합니다. 즉, 일반적인 경우에서처럼 호출되는 함수의 결과 값이 호출하는 함수에 전달되는 것이 아니라, 호출되는 함수의 코드 자체가 하나의 함수자체가 매개변수로 전달되기 떄문에 위와같은 결과가 나타납니다.


<함수의 일부 인수 고정하기>


부분 적용 함수라는 개념이 있습니다. 


예) 

def main(args:Array[String] : Unit = {
  val thisYear = 2016

 //아직 인수가 존재하지 않지만,
 //_와일드카드를 사용해 어느 String값이든 들어올 수 있다고 선언
 val fixedValueFunction = go(thisYear, _:String);
 
//go() 가 아니라 fixedValueFunction형태로 호출
fixedValueFunction("test1");
fixedValueFunction("test2");
fixedValueFunction("test3");

}

def go(thisYear: Int, string : String) {
  println(string + " : " + thisYear);
}



댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬