Stop Thinking, Just Do!

Sungsoo Kim's Blog

Introduction to Scala

tagsTags

2 June 2015


Article Source


Before Started…

최근 Scala라는 언어에 대해서 들어본 분이 많을 것이라 생각됩니다. Scala는 Ruby On Rails 처럼 수많은 관심을 이끌어 내며 화려하게 등장하지는 않았지만,  이미 Twitter, Foursquare, Tumblr 등의 잘나간다하는 소프트웨어 회사들에서 주 언어로 쓰이며 조용히 자신의 존재감을 널리 알리고 있습니다. Scala가 많은 대형 서비스에서 쓰이고 있다는 점은, Scala가 단순히 언어적 화려함이나 문법 설탕(syntactic sugar) 덩어리가 아니라,  그 만큼 강력하며 안정성 있는 언어라는 점을 보여줍니다.

이 글의 목적은 이렇게 요즘 뜨는 Scala 라는 언어에 대한 소개와 몇몇 Scala framework들에 대한 소개를 통해 여러분의 지적 욕구를 자극하고 Scala를 널리 알려 여러분을 이롭게 하고자 하는데 있습니다.

하지만, 익히 알려진데로 함수형 언어에 익숙지 않고 하나의 언어 (특히 자바) 만을 사용했던 개발자라면 Scala 는 극악의 난이도로 다가올 수도 있습니다. Scala의 창시자인 Martin Odersky가 저자로 참여한  “Programming in Scala 2nd Edition” 의 머리말에 보면 이런 문구가 나옵니다.

“Scala will challenge you. That’s part of the joy of using it. You won’t understand the full power of its type system by the end of your first day. You won’t understand the zen of objects being functions and functions being objects in your first week. …”

한마디로, Scala는 어렵습니다. 하고자 하는 바도 많고 할 수 있는 것이 많기 때문에 그만큼 유연하고 그만큼 복잡합니다. 그런것을 배워 나가는것 또한  개발자의 큰 즐거움 아닐까 합니다 :)

What is Scala?

Scala는 Martin Odersky 라는 독일인 컴퓨터 과학자에 의해 2001년에 시작되었으며 2003년에 첫 release가 이루어진, JVM과 .NET 을 런타임으로 하는 프로그래밍 언어입니다. Martin Odersky는 이전에는 Java의 Generic과 Sun의 java compiler 를 위해 일했었다고 합니다.

Scala 라는 이름은 “Scalable Language” 의 약자라고 알려져 있습니다. “scalar” (수 또는 양, <-> vector) 나 “scholar” (학자, 학식이 있는 사람) 등의 단어를 떠오르는게 왠지 나중에 약자를 붙인 게 아닐까 의심이 들기도 합니다만, 이름은 중요하지 않습니다. 이 Language가 어떤 놈이고 왜 써야하고 얼마나 훌륭한 놈인지가 오늘의 주제이니까요.

* 이하 모든 내용은 JVM을 기반으로 합니다.

JVM 기반 언어

Scala는 Groovy나 Clojure 등의 언어처럼 JVM을 실행환경으로 하며, 컴파일러를 통해 자바 바이트 코드로 컴파일 됩니다. 즉, “.scala” 파일을 컴파일 하면  “.class” 파일이 나오며, 이후로는 자바와 동일하게 다뤄도 무방하며, Scala는 이를 통해 아래와 같은 특징들을 가지게 됩니다.

1. 모든 표준 JVM 위에서 구동 가능

Scala는 컴파일되면 “.class” 파일이 되며, 구동시에는 자바에서 컴파일된 class와 차이가 없습니다. 따라서 모든 표준 JVM에서 구동가능하며, “.class” 파일이 만들어지기 때문에, Dalvik 위에서도 구동 가능합니다.

2. 수많은 자바 라이브러리 및 툴 사용 가능

Scala는 자바와 상호 운영성(interoperability)를 가집니다. 실행시에는 단순히 “.class” 파일 이기 때문에 아무런 문제 없이 수많은 오픈 소스 라이브러리를 자바와 마찬가지로 그대로 사용 할 수 있습니다.

3. 성능 손실 없음

Scala 컴파일러는 성능 손실을 발생시키지 않습니다. 동일한 목적의 코드라면 Scala를 사용했다고 해서 자바보다 성능이 떨어질 일은 없습니다. 또한, Scala가 가지는 많은 강점들은 모두 Compile time 에 이루어지며 reflection 등을 이용해 runtime 에 이루어 지지 않습니다.  앞으로 언급할 모든 강력한 Scala의 기능들은 컴파일 타임에 이루어집니다.

모든것은 컴파일 타임에!

객체 지향 언어 (Object-oriented language)

Scala는 객체 지향 언어입니다. 기본적으로 자바와 유사한 형태의 객체 지향을 지원하지만, Scala는 자바보다 Smalltalk에 가까운 순수한 객체 지향 언어로 자바와는 다음과 같은 점이 다릅니다.

No primitive type

자바와 달리, Scala는 모든 정수/실수 형태의 값 들 역시 객체로 표현되며, operator overloading을 통해 해당 객체에 대한 연산을 지원합니다. 예를 들자면 1+1 의 연산은  1.+(1)  과 같으며 + 는 Int 객체에 정의된 instance method 입니다.

Trait

Scala는 trait 이라는 형태의 container를 제공합니다. 기본적으로 자바의 Interface와 유사하지만, Scala의 trait은 메소드에 대한 구현을 가질 수 있으며 변수 역시 가질 수 있습니다. 또한, mix-in composition이라 불리는 다중 상속과 유사한 기능을 제공하며, 부모 클래스에대한 구체적인 명시 없이 코딩을 할 수 있기 때문에 좀더 “pluggable” 한 코드를 작성 가능합니다.

* Spring 이나 Guice 같은 별도의 엔진 없이도 DI가 가능합니다. (cake pattern)

함수형 언어 (Functional language)

Scala는 함수형 언어(functional language) 입니다. 동시에 객체 지향 언어이기 때문에, 기존의 순수한 함수영 언어인 LISP 계열의 언어와는 조금 다른 표현법을 가지지만, 기본적으로 함수형 언어의 기본적인 특성을 제공하고 있습니다.

First class functions

함수형 언어에서 함수는 1, “a” 와 같은 일반적인 값과 다르게 취급되지 않습니다. 함수는 인자로 전달 될 수 있으며, 변수를 정의하듯 함수 안에서 함수를 정의 할 수 있습니다. 이런 점을 통해 함수형 언어에서는 함수를 통해 좀 더 강력하고 표현력 있는 control flow 를 만들어 낼 수 도 있습니다.

Scala에서는 함수를 literal 로 표현 할 수 있으며 이는 강력한 표현력을 제공해 줍니다. “callback” 함수를 정의하기 위해 필요도 없는 익명 객체를 정의하거나 listener type을 별도로 정의할 필요도 없습니다. 함수 자체가 클래스와 동일한 최상위 개념이기 때문이죠.

Less side effects (Immutable data structure)

또다른 함수형 언어의 가장 큰 특징은 side effect가 없어야 한다는 점입니다. 함수가 인자로 전달 받은 값 이외에 어떠한 상태 변경도 발생하지 않아야 한다는 것입니다. 즉, 전달 받은 값으로부터 연산 결과를 리턴하지만 이 과정에 어떠한 내부 상태도 변경되어서는 안된다는 점입니다.

이미 자바에도 String 클래스의 구현이 그러한데, 기본적으로 모든 operation은 immutable 한 상태를 보장하기 때문에 모든 String class의 함수들은 새로운 값을 리턴합니다.

Scala는 기본적으로 immutable 값을 권장하며 때에 따라서는 변경 가능한 변수를 사용 가능합니다. 즉, 때에 따라서는 명령형(imperative) 스타일로 변수를 사용할 수 있으며, mutable한 상태를 가질 수 있다는 말입니다. 하지만, 이는 명령형 방식에 익숙한 개발자들의 편의 및 특정 상황에서 imperative 스타일이 좀 더 명확할 수 있다는 점에서 제공하는 것이지, 절대로 mutable 변수를 공개하거나 공유하는 것은 피하는 것이 좋습니다.


comments powered by Disqus