본문 바로가기
Programming/Scala

[4강] 함수형으로 만들자

by 유주원 2015. 4. 16.

당장 Scala를 사용하기도 어려운데 함수형으로 만들어 보는 건 더더욱 힘든일 인 것 같다.


몇 가지 규칙을 정해서 함수형 코딩을 하는 습관을 기르도록 하자


첫번째로 var의 사용을 줄이자.


var는 mutable한 자료형이다. mutable한 자료는 어느 순간 이상 동작을 일으킬 가능성이 높고, 예외 상황을 발생 시킬 수 있기 때문에 가급적 immutable한 자료형의 사용을 늘리도록 하자. 

아래의 예제를 보면


var i = 0

while(i < args.length){

    println(args(i))

    i += 1

}


이 코드로 argument 값을 출력할 수가 있다. 하지만 아래와 같이 코딩 스타일을 변경하면 mutable한 자료형 없이 같은 결과를 낼 수 있으며 코드 복잡도도 줄어드는 효과를 얻을 수가 있다.


for (arg <- args){

    println(arg)

}


두 번째는 함수의 부수 기능들을 줄이자.


위의 예제에서 부수 기능이라고 하면 println을 들 수가 있다. 함수형 언어라고 하면 해당 입력값을 처리하는 역할만을 수행해야 하는데, 해당 입력값을 처리한 후 그것을 화면에 출력하는 역할까지 하고 있으니, 출력하는 부분은 부수적이라고 할 수 있겠다.

그래서 부수적인 기능을 제거하여 아래와 같이 바꿔줄 수 있다.


def formatArgs(args:Array[String]) = args.mkString("\n")


해당 argument를 받아서 "\n"으로 구분된 하나의 string으로 return해주는 역할을 하는 함수이다. argument를 String으로 변환해주는 역할만을 담당하고 있다.


이렇게 부수 기능들을 제거하면 unit 테스트를 할 때에도 상당히 편하다.


val res = formatArgs(Array("Hello", "World"))

assert(res == "Hello\nWorld")


만약 부수 작업이 함수내에서 계속 존재했었다면 함수 내에서 계속적으로 조작하여 unit test를 진행해야 했을 것이다.