스케일러블하고 함수형이며 오브젝트 지향인 Scala 입문 (1)

[번역] Eclipse로 Scala 프로그래밍을 시작하기 위한 기초 지식 (1/3)

 

2012.02.10 [나카무라 슈타, 주식회사 클래스 메소드]

 

일어 원문: http://www.atmarkit.co.jp/ait/articles/1202/10/news122.html - 일본 IT 관련 사이트

 

- 본 글은 위 일어 원문 링크의 글을 번역하였습니다.

 


 

 

인기인 'Scala'를 처음부터 배워보자

 

 최근에 제 주변에도 Scala에 관한 화제가 늘어나고 있습니다. Twitter나 블로그, 기술계 뉴스 사이트에서 매일같이 Scala에 관한 이야기가 보입니다.

 

 또, 필자가 현재 연관되어 있는 프로젝트에서도 실제로 Scala를 써서 개발하고 있습니다. 지금까지는 Java로 개발하는 일이 많았지만, 그것보다 간결하고 유연성 있게 작성할 수 있어, Scala로 개발하는 것은 매우 생산성이 높다고 느끼고 있습니다.

 

 본 연재는 Scala의 특징을 소개하고, 기본 구문이나 함수, 클래스 등 Scala의 기본적인 기능에 대해 설명하려 합니다. 어떤 프로그래밍 언어를 배운 적이 있고, 프로그래밍의 기본적인 부분을 알고 있는 사람을 대상으로 하고 있습니다. 딱히 언어를 따지지는 않지만, 오브젝트 지향 언어의 경험자라면 이해하기 쉬울 것이라 생각합니다.

 

 첫 연재인 이번 글에서는 Scala의 특징을 소개하고, 개발을 시작하기 위한 준비부터 최초 Scala 프로그램 실행까지를 소개합니다.

 

 


 

 

Twitter나 Foursquare, LinkedIn이 사용하는 'Scala'란 


 
'Scala'란, 표준 Java 플랫폼 상에서 동작할 수 있는 프로그래밍 언어입니다. 2003년쯤 등장한 비교적 최신 언어입니다만, 이미 Twitter나 Foursquare, LinkedIn에서 사용한바 있습니다. 일본에서도 몇 가지 사용 사례가 있는 듯 합니다.

 

 

 Scala (스칼라) 란 이름은 '스케일러블(Scalable) (확장가능)한 언어' 를 의미합니다. Scala는 Java의 Generics (제네릭형) 의 설계 등에도 관련되었던 스위스 연방 공과대학 (EPFL)의 Martin Odersky(마틴 오더스키) 교수에 의해 설계, 개발 되었습니다.

 

 교수에 의하면, Scala 언어 개발의 동기로, 아래의 두 가지가 있다고 합니다. (일본 Wikipedia 에서 인용)

 

 1. 범용 언어는 스케일러블(확장가능) 해야한다. 같은 개념으로 작은 프로그램도 큰 프로그램도 작성할 수 있어야 한다.

 

2. 스케일러빌리티 (확장성)는 함수형 언어오브젝트 지향 언어의 두 가지 프로그래밍 개념을 통합하고, 일반화 함으로써 실현 가능하다.

 

 개발 동기에 써있듯이 Scala는 작은 스크립트 용도에서 대규모 시스템에서 사용하는 언어로써의 용도까지 다양한 니즈에 응할 수 있도록 되어 있습니다. 그리고, 그 확장성을 실현하기 위해서 '오브젝트 지향 언어와 함수형 언어의 개념을 결합하고 있다'라는 특징을 가지고 있습니다.

 

 또 Scala 공식 사이트의 Scala 소개문에서는 맨 처음에 아래와 같이 기술되어 있습니다. 

(Scala 공식 사이트에서 인용)

 

Scala is a general purpose programming language designed to express common programming patterns in a concise,  

elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages,

enabling Java and other programmers to be more productive.

Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application

 

 그 일본어 번역입니다. (프로그래밍 언어 Scala 일본어 정보 사이트에서 인용)

 

Scala는 범용적인 프로그래밍 패턴을 간결하고 세련되게 그리고 형안전하게(type-safe) 표현하기 위한 범용 프로그래밍 언어입니다.

Scala는 오브젝트 지향의 기능과 함수형 언어의 기능을 잘 결합하고 있어, Scala를 사용함으로써, Java나 그 외 프로그래머의 생산성은 보다 향상될 것입니다. 

Scala의 코드 사이즈는 전형적으로는 같은 기능을 실현한 Java 어플리케이션과 비교해서 2분의 1에서 3분의 1 정도입니다.

 

 '오브젝트 지향, 함수형 언어의 기능을 결합함으로써 보다 간결하게 코드를 작성할 수 있어 생산성이 향상된다' 고 이야기하고 있습니다.

 

 


 

 

코드를 Java 와 Scala로 비교해 보자 

 

 여기서 한 가지 예를 들어봅시다. 아래의 코드는 '인수로 전달된 문자열인 리스트 중 제 2 인수로 지정한 길이 이상의 요소를 모두 대문자로 변환하고, 그 요소를 함수 내부에서 새롭게 정의한 리스트에 추가하여 반환한다' 는 함수를 Java에서 작성한 것입니다.

 

Java의 소스 코드

 

 리스트를 루프로 돌리고, 요소마다 길이를 체크해서 조건에 맞는 요소를 함수 내부에서 정의한 리스트에 추가하고 있습니다.

 

 같은 처리를 Scala에서 작성하면 이렇게 됩니다.

 

Scala의 소스 코드

 

 전달된 리스트를 길이 (len)로 필터링하고 결과 리스트의 요소마다 모두 대문자로 변환한 리스트를 반환합니다. 어떻습니까? 확실히 Java 코드 보다 훨씬 작은 코드량을 보입니다. 

 

 이것은 극히 간단한 예이지만, Scala라면 간결하고 알기 쉬운 코드를 쓸 수 있다는 걸 알 수 있습니다.

 

 


 

 

기존의 언어에서 좋은 것만 가져온 'Scala'의 다섯가지 특징

 

 

 Scala는 아래와 같은 특징을 가지고 있습니다. 다양한 기능을 가지고 있지만, Scala만이 가지고 있는 특수한 기능이란 건 별로 없고, 기존의 프로그래밍 언어에서 좋은 부분만을 받아 들여 밸런스를 잘 맞추고 있다고 생각합니다.

 

 

[1] Scala는 오브젝트 지향 언어

 

 Scala는 순수한 '오브젝트 지향' 언어입니다. 모든 값은 '오브젝트' 이며, 모든 조작은 '메소드' 입니다. 

 

 Java의 int형이나 double형과 같은 프리미티브형은 존재하지 않습니다. 예를 들어 Scala에서 '1+2' 라는 코드는 'Int 클래스 (값은 1) 의 '+' 라는 이름의 메소드에 인수 2를 전달한다'는 의미입니다.

 

 또 Scala에서는 오브젝트 지향을 실현하기 위해 클래스 베이스의 상속과 '믹스인(mixin) 합성'을 지원하고 있습니다.

 

 '믹스인 합성' 이란 '트레이트(trait)' (Ruby에서 말하는 '모듈', Java로 따지자면 '구현을 가질 수 있는 인터페이스와 같은 것')을 사용하여 하나의 클래스에 대해서 복수의 구현을 가지는 기능을 맞출 수 있게 되는 것입니다.

 

[2] 함수형 프로그래밍이 가능

 

 '함수형 프로그래밍'이란 단어는 최근에 자주 듣는 용어일지도 모릅니다. 이것은 간단하게 말하자면, 부작용(데이터의 내부 상태를 변경하는 것)이 없는 '함수'를 사용해서 프로그램을 구축하는 프로그래밍 수법입니다.

 

 함수형 프로그래밍의 이점으로, '함수가 자기 완결하고 '상태'가 없기 때문에, 가독성이나 보수성, 테스트, 리팩토링이 쉬워진다'는 장점이 있습니다.

 

 Scala에서는 함수를 '퍼스트 클래스'로써 취급합니다. 즉, '정수나 문자열 등과 같이 함수를 인수나 리턴값으로 할 수 있다'는 것입니다.

 

 또 '정수'(val)이나 '불변 콜렉션'을 사용해서 프로그래밍 할 수 있습니다.

 (※ 변수 (var)나 가변 콜렉션을 사용해도 상관없습니다)

 

 이러한 특징을 가지고 있기 때문에 표현력이 좋아 간결하게 작성할 수 있습니다.

 

 오브젝트 지향과 함수형 프로그래밍은 대립하는 개념이 아니라, Scala에서는 이것들이 잘 어우러져 간결한 작성과 유연성을 실현하고 있습니다.

 

[3] 정적 타이핑

 

 '정적 타이핑'이란 변수나 함수가 미리 정해진 데이터형을 처리하도록 엄밀한 작성을 요구하는 프로그래밍 언어의 특성입니다.

 

 Scala는 정적 타이핑 언어여서 안전하게 추상화 할 수 있는 타입 시스템을 가지고 있습니다. 그 때문에 타입에 의한 에러는 실행할 때가 아니라, 컴파일 때 알 수 있습니다.

 

 "정적 타이핑이면, 타입 작성에서 프로그램이 장황해 지는 것 아니냐?"라고 생각하는 분들도 있을지도 모릅니다. 하지만, Scala에서는 타입 추론에 의해 타입 기술을 생략할 수 있어 간결한 표현을 할 수 있게 합니다.

 

[4] Java와의 연계

 

 Scala의 소스 파일을 컴파일하면, JVM (Java 가상 머신)의 바이트 코드가 됩니다. Java 가상 머신 상에서 동작하기 위해 Scala에서 Java의 메소드나 필드도 불러 들일 수 있고, 역으로도 가능합니다.

 

 즉, 기존의 풍부한 Java 라이브러리를 그대로 활용할 수 있습니다.

 (※ 일부 예외는 있습니다)

 

[5] 병행처리

 

 현재는 CPU의 멀티코어화 (하나의 프로세서에 복수의 프로세서, 코어를 집어넣은 기술) 가 당연해졌습니다. Java에서 병렬처리를 실행할 때는 java.lang.Thread 클래스나 java.util.concurrent 패키지를 사용해서 병렬처리를 실현합니다.

 

 Scala에서는 멀티 코어를 의식해서 효율좋게 병렬처리를 행하기 위한 'Actor'라고 불리는 라이브러리를 가지고 있습니다. 이것은 '액터 모델(actor model)'에 기반한 라이브러리로, 액터끼리 서로 메세지를 보내 처리를 하는 프로그래밍 모델입니다.

 

 거기에 Scala 2.9에서부터는 병렬처리 대응 콜렉션 (palallel collection)이 사용 가능해 졌습니다. 이것은 콜렉션을 병렬화하여 각각의 스레드에서 실행하는 처리를 간단히 작성할 수 있습니다.

 

 다음 페이지에서는 Scala를 인스톨 해 봅시다.

 

 다음 페이지: [번역] Eclipse로 Scala 프로그래밍을 시작하기 위한 기초 지식 (2/3)

 

 

 

Posted by 이슈타르네스

댓글을 달아 주세요