gimmesilver's blog

Agbird.egloos.com

포토로그



자바 프로그래머를 위한 함수형 언어 스칼라 프로그래밍

 최근에 스칼라라는 언어를 알게 되었습니다. 스칼라는 JVM(Java Virtual Machin)에서 동작하는 함수형 언어입니다. 자바 제네릭을 주도한 Martin Odersky 가 만들었으며 함수형 언어이면서도 자바의 객체 지향 특성을 거의 그대로 가지고 있을 뿐더러 기존의 자바 라이브러리를 그대로 사용할 수 있다는 점 때문에 자바 프로그래머들에게 특히 주목을 받고 있다고 합니다.
 한 1주일 정도 살펴봤는데 매력적인 특징들이 많더군요. 특히 문법적인 부분에서 기존 자바 문법에서 번잡스러운 것들을 많이 제거했습니다. 다음은 스칼라의 몇 가지 특징입니다.

1. 타입 추론 기능을 가지고 있습니다. 
  - 스칼라는 자바처럼 정적 타입 언어이지만 하스켈처럼 타입 추론 기능을 가지고 있기 때문에 변수 선언 시 타입을 지정할 필요가 없습니다. 때문에 얼핏 보면 동적 타입 언어와 비슷해 보입니다. 하지만 사용해보니 하스켈에 비해 타입 추론 기능이 많이 떨어져서 좀 아쉽더군요...

2. 객체 지향 + 함수형 패러다임 언어입니다. 
  - 스칼라는 재밌게도 순수 객체 지향 패러다임을 통해 함수형 프로그래밍 특성을 지원합니다. 무슨 말인가하면 함수형 언어에서는 모든 것이 함수로 이루어져 있으면서 함수가 값처럼 취급되기 때문에 함수를 입력 인자나 결과값으로 자유롭게 주고 받을 수 있는 반면 스칼라에서는 함수를 객체로 취급함으로써 자연스럽게(객체는 값이니까) 값으로 사용할 수 있습니다. 결국 결과는 같지만 그 결과를 이끌어내기위해 사용하는 사고의 도구가 다른 것이죠. 

3. 각종 디자인 패턴을 idiom(관용어구)로 지원합니다.
  - 예를 들어 싱글톤 패턴을 문법적으로 지원합니다. 싱글톤으로 만들고 싶은 클래스는 선언 시 class 대신에 object 라고 하면 그 클래스는 싱글톤 클래스가 되며 이 클래스의 메소드들은 전부 static 메소드가 됩니다. 예를 들면 자바에서는 다음과 같이 할 것을

class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}

스칼라에서는 다음과 같이 하면 됩니다.

object
Main {
    def main(args:Array[String]) {
        println("Hello, world");
    }
}

  - 그 외에도 strategy 나 factory 등의 패턴을 기존 객체 지향 언어보다 쉽게 구현할 수 있습니다. 이에 대해서는 Design Patterns in Scala 라는 글을 한번 읽어보시기 바랍니다.

4. 함수형 언어가 가진 장점들을 상당수 지원합니다.
  -  이제는 대부분의 최신 언어에서 필수적으로 제공되거나 제공될 예정으로 있는 클로저(혹은 람다)함수를 지원합니다. 
  - 패턴 매칭을 지원합니다. case class 라는 것을 이용해서 제공하는데 객체 지향 특성을 이용해서 패턴 매칭을 지원하는 방식이 꽤 신선합니다.
  - 심지어 커리 함수도 가능합니다. 근데 하스켈처럼 언어 차원에서 지원하는 기능이 아니기 때문에 커리 함수를 만들기가 좀 번거로운 것이 단점입니다.

5. erlang 처럼 message passing 방식의 동기화 프로그래밍이 가능합니다.
  -  Actor 라는 클래스를 이용하면 erlang처럼 스레드간에 메시지를 주고받는 방식으로 동기화 프로그래밍을 할 수 있습니다.

6. 하스켈의 Maybe 모나드를 지원합니다.
  - Maybe 는 하스켈에서 사용하는 에러 처리 방식입니다. 기존의 true/false 나 예외를 이용하는 방식이 갖지 못한 편리한 에러 처리 방식인데 스칼라에서는 Option 이라는 클래스와 패턴 매칭을 이용해서 Maybe 모나드를 구현했습니다.

7. 연산자 오버로딩을 지원합니다.

 이처럼 스칼라는 함수형 언어 특히 하스켈에서 소개된 다양한 기능들을 많이 수용했으면서도 객체 지향 언어이기 때문에 함수형 언어를 배우고 싶은 자바 프로그래머들에게 좋은 시작점이 될 수 있으리라 생각합니다. 특히 패턴 매칭이나 커리 함수같은 함수형 언어에서는 지극히 추상적으로 표현된 기능을 비교적 저수준에서 구현하기 때문에 사용법은 좀 불편해도 그 원리나 방식을 이해하는데는 좋으리라 생각합니다.저도 기회가 되는대로 스칼라를 공부해보면서 위에서 언급한 특성 및 그밖에 다양한 측면을 소개해보도록 하겠습니다.

핑백

덧글

댓글 입력 영역