본문 바로가기
Programming/Scala

[1강] Scala 소개

by 유주원 2015. 4. 13.

Scala 


이름은 참 많이 들어봤지만 정확히 무엇에 쓰이는 언어이고 무엇이 좋은지는 하나도 알지 못하고 있었다.

요새 차츰 함수형 언어가 각광받기 시작하고 있고, 그에 따라 scala란 언어도 사람들 사이에서 주목받고 있다.

또한 개발자 로망 중에 하나가 능숙한 함수형 언어 하나 다뤄보는 것 아닐까나??


해서 나 역시 scala를 공부하기로 다짐 또 다짐하였다.

일단 scala란 이름은 scalable한 언어란 뜻을 가지게 하기 위해 scala로 지었다고 한다.

'얼마나 확장 가능하길래 이름 부터가 scala지?'


[성당과 시장]이라는 책에서 보면 성당과 시장을 소프트웨어 개발에 비유하며 설명하고 있다.

성당은 일단 뼈대를 잡고 한번 구축하기 위해 많은 시간이 걸리지만, 한 번 구축하면 오랜 시간 그 구조를 유지할 수 있는 반면

시장은 안의 상인들이 언제고 그 구조를 변경하며 물건을 팔 수가 있다.


스칼라는 성당보다는 시장에 가까운 언어라고 한다. 

아직 스칼라를 직접 접해본 게 아니라 명확한 설명은 할 수가 없지만, 먼가 내 입맛에 맞는 자료 구조를 짜거나 함수들을 재정의 할 때 수월하고 쉽게 할 수 있는 무언가가 있는 것 같긴 하다..

마인 크래프트 처럼 소프트웨어 툴 안에서 또 다른 소프트웨어 툴을 만들어낼 수 있는...


그럼 이제부터 간단히 스칼라 문법에 대해 학습해 보자.


변 수


스칼라에는 두 가지 형태의 변수가 존재한다.

바로 var와 val이다.

val은 자바의 final과 비슷하다고 생각하면 된다.( immutable) - 한번 할당이 되면 수정이 절대적으로 불가능하다.


scala> val msg = "Hello, world!"

msg: java.lang.String = Hello, world!


위의 변수 선언에서 보면 단지 val이라고만 선언했을 뿐인데 결과는 java.lang.String이라고 엄연한 String 타입을 리턴하고 있다. 이는 스칼라 인터프리터에서 타입 추론을 함으로써 String이라고 추론을 내린 것이다.

아래와 같이 명시적으로 타입을 써줘도 무방하다.


scala> val msg: java.lang.String = "Hello, world!"


보기엔 좀 더 복잡해 보이지만 가독성 측면에서 타입을 명시해줘야 하는 경우도 있기 때문에 알아 두고 가자.


msg를 val로 선언했기 때문에 아래와 같이 재할당을 할 경우 인터프리터에서는 에러를 밷어낸다.


scala> msg = "Hello, my home"

error: reassignment to val


함 수


스칼라 함수는 아래의 예시처럼 작성한다. 처음 봤을 때는 다소 복잡해 보이기도 한다.


def max(x: Int, y: Int): Int = {

    if(x > y) x

    else y

}


모든 함수의 정의는 def로 시작한다. 그 다음에는 함수 이름이 오고 그 다음에 오는게 바로 함수가 받는 인자이다.

첫번째가 인자의 이름(여기서는x,y), 두번째가 인자 타입(여기서는 Int).

그리고 마지막으로 나타나는 Int는 이 함수의 리턴 타입이 Int라는 것을 명시하기 위해 쓰인다.

중괄호 안에는 실제 함수의 내용이 들어간다. 함수 내용을 보면 따로 리턴이 없는데, 계산하고 난 가장 마지막 값을 스칼라에서는 리턴한다.


scala에서의 void는 그럼 어떻게 표현해야 하나???

scala에서는 Unit이라는 리턴 타입이 있다. 해당 위치에 Int 대신 Unit을 입력하게 되면 이 함수는 아무것도 리턴받지 않음을 나타낸다.


함 수 리터럴


argument를 입력으로 받아서 출력하는 프로그램을 짜보자.


var i = 0

while ( i < args.length){

    println(args(i))

    i += 1

}


위와 같이 작성하고 실행해보자.


scala> scala test.scala hello scala

hello

scala


hello scala란 매개 변수를 받아서 한 줄 씩 출력해주고 있다.

위와 같이 짜는 방식을 imperative style이라고 한다. 명령을 나타내는 코드를 한 줄 씩 작성하고, while 루프를 돌며 해당 명령을 수행한다.

이 방식은 C나 Java에서 많이 써왔던 방식이며, scala에서는 이 방식 외에 함수형 style 방식으로도 짤 수가 있다.


args.foreach((arg:String) => println(arg))


이렇게 한 줄이 위의 코드와 동일한 기능을 한다.

괄호 안에 arg는 함수에 사용될 인자를 나타내고, 그 옆에 String은 인자의 타입을 나타낸다.

화살표 모양의 기호 오른쪽에는 함수의 본문이 들어간다.

이렇게 축약으로 쓰는 것을 함수 리터럴이라고 부른다.