Skip to content

2장 first steps in scala

dgkim84 edited this page Apr 13, 2013 · 26 revisions

Step 1. Learn to use the Scala interpreter

스칼라에서 제공하는 인터프리터를 이용해 표현식을 써서 evaluate 할 수 있고 결과를 바로 확인할 수 있는 인터렉티브 쉘(shell)을 제공한다. 프롬프트에 scala 명령을 통해 바로 사용할 수 있다. 첫 스텝에서는 단순한 1 + 2와 같은 수식을 통해 인터프리터의 특징을 보자.

scala> 1 + 1 입력하면 인터프리터는 res0: Int = 2 를 출력한다. 인터프리터 출력은 다음 정보를 포함한다.

  • 연산된 결과를 가르키는 이름 : 자동으로 생성되는 resX 이거나 사용자가 직접 작성한 이름이다.
  • 결과 타입 : 콜론과 표현식의 타입이 따라 붙는다.
  • 등호 (=)
  • 표현식을 통해 evaluate된 결과

예제에서 Int는 scala.Int를 의미하고, 자바의 primitive 타입은 scala package의 클래스에 대응된다. 사용자가 작성한 스칼라 코드가 자바 bytecodes로 컴파일할 때 primitive 타입의 성능이점을 얻을 수 있다면 자바의 primitive type를 사용한다. 또한 스칼라 인터프리터가 자동으로 생성된 resX는 인터프리터에서 활용이 가능하다. 예제에서 2를 담고 있는 res0을 이용해 res0 + 100와 같은 표현식을 사용할 수 있다.

Step 2. Define some variables

  • 스칼라는 두가지 종류의 변수를 제공한다.
    • val: 자바의 final 변수와 유사하고 이미 할당된 변수는 재할당 할 수 없다
    • var: 자바의 final과 대조하는 non-final 변수와 유사하고 재할당이 가능하다.

이번 스텝에서는 스칼라의 특징 중 하나인 type inference를 소개하며, 스칼라 인터프리터는 사용자가 표현식 또는 구문을 쓰고 나면 타입을 알아낸다. val msg = "Hello World"와 같이 string literal으로 initialize한 경우, 스칼라는 msg 타입을 String 으로 추론한다. 스칼라 컴파일러 또는 인터프리터가 타입을 추론할 수 있다면 굳이 불필요한 타입을 작성할 필요가 없어진다. 물론, 사용자가 직접 타입을 선언할 수 있는데, 이는 컴파일러에게 의도한 타입으로 추론할 수도 있도록하고 나중에 코드를 볼 때 개발자가 타입을 추론하기에도 편하다.

val msg: String = "Hey you!" 와 같이 타입을 지정할 수 있으며, 변수명에 콜론과 함께 타입을 지정하면 된다. val 이므로 재할당은 되지 않고 할당했을 경우 에러가 발생한다. 재할당을 하고 싶은 경우는 var msg = "hello"와 같이 var를 사용하며, 재할당은 msg = "World"와 같이 할 수 있다. 스칼라 인터프리터는 표현식 작성을 통해서도 결과를 알 수 있지만, println 메서드를 통해서도 결과를 출력할 수 있다. 자바에서 System.out.println 와 유사하다.

  • REPL에서 엔터를 2번입력하면 명령이 종료된다

Step 3. Define some functions

  • 함수 정의는 def로 시작한다
  • 재귀함수일 경우는 result type을 반드시 명시해야 한다
  • 함수가 한문장이면 중괄호가 제거가능하다
  • Unit타입은 Java의 void 타입과 유사하다
  • REPL을 종료할때는 :quit:q를 입력한다

Step 4. Write some Scala scripts

  • spets 배열의 첫 값은 steps(0)임(steps[0]이 아님)
  • 주석은 // 나 /* */임

Step 5. Loop with while; decide with if

  • Scala에서 들여쓰기는 스페이스 2칸이 권장된다
  • Java의 ++ii++는 스칼라에선 동작하지 않는다
  • 세미콜론은 옵션이다

Step 6. Iterate with foreach and for

  • Imperative style
    • 한번에 하나의 imperative 커맨드
    • loop로 이터레이트한다
    • 다른 함수들 사이에 mutate state를 공유한다
  • Functional style
    • function은 fist-class이다
  • 함수리터럴이 하나의 아규먼트를 가지는 한문장으로 이루어졌을때는 이름과 아규먼트를 생략가능하다
    • args.foreach(println)
    • 이걸 partially applied function라고 부른다
  • for (arg <- args)에서 arg는 val이다

질문

  • REPL말고 코드에서도 재정의는 가능한거 아닌가요?

    In the interpreter, however, you can define a new val with a name that was already used before. - p71

  • Lion업데이트 뒤인지 2.9부터인지 REPL이 겁나 느린 느낌인데 저만 그런가요?(오랜만에 해서 그런가.. ㅡㅡ;;)

drypot님의 한글 번역

Clone this wiki locally