관리 메뉴

기억하기 프로젝트

[스칼라] 함수 본문

개발이야기/Scala

[스칼라] 함수

sy89 2017. 3. 30. 19:44

def 예약어를 통해 만들 수 있는 함수.

class HelloScala {
def main(args: Array[String]): Unit = {
println("Hello, Scala")
}
}

해당 예제에서는 반환형이 Unit인데, 이는 자바에서 void 자료형과 같다. 즉, 아무 자료형도 아님을 나타내므로 반환 결과가 없는 함수에 붙는 자료형이다.

 

또한, 스칼라 에서는 반환 값이 있을 때에도 반환 자료형을 생략하는게 가능하다.

다음의 name()에서 a를 return하지만, 반환 자료형을 생략한 것을 확인할 수 있다.

class HelloScala {
def main(args: Array[String]) = {
println("Hello, Scala. name:" + name())
}

def name() = {
var a = 10
a    // return a 라고 명시하지 않아도 알아서 반환함
}

}


5.7 함수 표현식의 예

=>를 이용한 계산 함수를 만들어보자. (매개변수 하나는 계산방식에 관한 함수, 두 번째는 계산할 처음값, 세 번째는 계산할 마지막 값. 최종적으로는 재귀함수를 이용해 값들에 대한 sum값을 출력해준다!)

object ex5_7 {
def main(args: Array[String]): Unit = {
val result = calc(x => x * x, 2, 5)
println(result)
}

def calc(f: Int => Int, start: Int, end: Int) = {
def loop(index: Int, sum: Int): Int = {
if (index > end) sum
else loop(index+1, f(index) + sum)
}
loop(start, 0)
}
}

 (2*2) + (3*3) + (4*4) + (5*5)

결과 : 54

calc 함수의 첫번째 인자 f는 함수 자체를 받도록 되어있어, calc안에서 함수형태로 사용 가능하다.

이처럼 함수 자체를 매개변수로 받을 수 있어, 프로그램 전체에 걸쳐 대입문을 사용해 값을 바꾸지 않을 수 있다고 한다..


5.8 매개변수 여러개인 함수

- java에서 사용하던 String ...strs 와 같이, 여러개의 매개변수를 받을 수 있도록 스칼라에서도 *형태로 지원을 해준다.

object ex5_8 {
def main(args: Array[String]): Unit = {
printlnString("str1", "str2", "str3")
}

def printlnString(args: String*): Unit = {
for (arg <- args) {
println(arg)
}
}
}

결과 : 

str1

str2

str3


5.9 매개변수의 기본값 설정

- 스칼라에서는 자체적으로 함수 매개변수의 기본값을 설정해줄 수 있다.

다음과 같은 경우, default()함수를 호출할 때 아무런 매개변수도 주지 않았기 때문에 에러가 났을 수 있겠지만, default값을 설정해주었기 때문에 오류없이 결과값을 확인할 수 있다.


object ex5_9 {
def main(args: Array[String]): Unit = {
println("기본값은 : " + default())
}

def default(a: Int = 4, b: Int = 5): Int = a + b
}

기본값은 : 9


5.10 apply()

- apply는 변수를 받아 함수에 적용시켜 결과를 만들어내는 설정자 역할을 함. 

object ex5_10 {
class SomeClass {
def apply(m: Int) = method(m)
def method(i: Int) = i + i
def method2(s: String) = s
}

def main(args: Array[String]): Unit = {
val something = new SomeClass()
println(something(2)) //인스턴스를 바로 부르면 apply가 호춮이 된다.
println(something.apply(2))
println(something.method(2))
}
}

결과는 모두 동일하게 4가 출력됨.

apply()를 명시적으로 부르지 않고, 인스턴스를 바로 부르면 apply()가 호출된다.

이와같이 apply() 메소드를 이용하면 생성자처럼 초기화 하거나, 클래스 안에 특정한 메서드를 기본 메서드로 지정하는 것을 편하게 할 수 있다.




'개발이야기 > Scala' 카테고리의 다른 글

스칼라 참고 자료  (0) 2017.04.10
[스칼라] 클래스/객체/트레이드  (0) 2017.03.24
[스칼라] 중첩문  (0) 2017.03.24
[스칼라] 시작 - 변수  (0) 2017.03.22