본문 바로가기

Programming/Scala

Scala 2.10 new features

Scala 2.10 이 release 되었다.


새로운 기능들과 성능 향상을 기대할 수 있다.


개인적으로 Scala 2.10 에서 String Interpolation 과 Value Class 를 이용하여 Type Conversion 을 사용하는 것을 꼽을 수 있겠다. :)


아래 코드들은 아래 링크에서 발췌하였다.

http://blog.typesafe.com/announcing-scala-210-a-simpler-way-to-tackle


새로운 기능


1. String Interpolation (문자열 삽입법)


문자열을 삽입하기 위하여 s 다음에 " (double quote)로 둘러쌓은 다음, $ 를 변수 앞에 붙인다.

println(s"The word of the day is ‘$wordOfTheDay’.")


아래와 같이 수식을 삽입할 수도 있다. ${... } 와 같이 $ 와 { (Curly Brace)로 둘러 쌓아주면 된다. 이렇게 하면 String Interpolator 가 수식을 평가하므로써, Type Safe 한 코드를 작성할 수 있다.

// log only two digits after the decimal to display as seconds
log.info(f"Time elapsed: ${millisElapsed/1000.0}%.2fs.")



2. Asynchronous Programming model (비동기식 프로그래밍 모델)

    - Play 와 Akka 를 개발하는 개발자 들에게 엄청나게 많은 비동기 요청을 동시에 보낼 수 있도록 허용한다.


def profile(user: User) = Action {
      Async {
        for {
          lastPostId <- user.fetchLastPostId
          posts      <- fetchPosts(user, lastPostId)
          avatar     <- user.fetchAvatar
        } yield Ok(views.html.profile(user, posts, avatar))
      }
    }


위와같이 단순한 코드로 Scala, Play, Akka 프로그래밍을 동시성을 고려하고, 간단하고, 정확한 코드를 작성할 수 있다.


3. Value Class (값을 위한 클래스)

    - Scala 2.10 에서는 runtime 시에 오버헤드를 줄이기 위해서 Value Class 를 제공한다. 이 Value Class 를 이용하여 추가적인 객체 생성 없이 프로그램이 구동되게 할 수 있다.


아래 코드는 integer 값을 16진수를 의미하는 문자열로 돌려주는 일을 하는 클래스를 정의한다. RichInt 클래스는 AnyVal 이라는 클래스를 상속받아서 Value 클래스의 기능을 이용한다.

class RichInt(val self: Int) extends AnyVal {
 def toUpperHexString: String = java.lang.Integer.toHexString(self).toUpperCase}


Value 클래스의 기능에 대해서 자세히 알고 싶으면 아래 링크를 참고하면 된다.

http://docs.scala-lang.org/overviews/core/value-classes.html


아래 코드에서 new RishInt(2) 는 Scala 에 의해서 자동으로 최적화 과정을 거쳐서 인스턴스가 항상 Int 의 instance 로 고정되게 한다. 그래서 이코드는 실행 시간을 단축시키고 메모리를 적게 사용하도록 한다. :)

val x = new RichInt(2) // at run time, x is simply an integer!
x.toUpperHexString


아래의 코드는 위와같이 새로운 인스턴스를 생성하는 bolier plate 코드를 작성하지 않고 바로 Value 클래스를 사용하도록 implicit 키워드를 사용한다.

implicit class RichInt(val self: Int) extends AnyVal { … }
2.toUpperHexString // no explicit wrapping required anymore!


이에 대한 자세한 예제는 Outsider 님의 블로그에 자세히 나와 있기 때문에 추가적인 설명은 필요 없어서 생략하도록 한다.


Outsider 님의 Value 클래스에 대한 글

http://blog.outsider.ne.kr/895?category=40


4. 스칼라가 사용자들을 위해 각기 다른 언어 레벨을 사용할 수 있도록 방법을 제공한다.


성능 향상


1. Pattern-Matcher 가 견고하고 사용자에게 친숙한 에러 메시지를 출력하도록 코드가 다시 작성 되었다.

2. JDK 1.5, 1.6, 1.7 을 지원하고 보다 빠른 byte code 생성을 위해서 byte code 생성기가 ASM 을 사용한다.

3. scaladoc 이 비명시적으로 추가된 멤버변수 와 상속 도표와 멤버변수 그룹화를 한다.

4. 실험적인 기능인 Macro 와 Reflection 을 제공한다.

5. Dynamic trait 이 동적 타입인 객체 사용을 위해 편리한 방법을 제공한다.



보다 자세한 내용과 원문을 보고 싶으면 아래 링크를 참고하면 된다.

http://blog.typesafe.com/announcing-scala-210-a-simpler-way-to-tackle


더 읽을 거리 (Value Class)

http://docs.scala-lang.org/overviews/core/value-classes.html