Skip to content

2장 first steps in scala

anarcher edited this page Aug 27, 2011 · 26 revisions

drypot님의 한글 번역

Step 1. Learn to use the Scala interpreter

  • Java의 primitive 타입은 scala package의 클래스에 대응된다
  • 스칼라코드를 Java bytecode로 컴파일할 때 primitive type의 성능이점을 얻을 수 있다면 Java의 primitive type를 사용한다

Step 2. Define some variables

  • 2가지 변수의 종류가 있다

    • val : Java의 final과 유사하며 재할당 할 수 없다
    • var : Java의 final이 아닌 변수와 유사하면 재할당할 수 있다
  • 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이 겁나 느린 느낌인데 저만 그런가요?(오랜만에 해서 그런가.. ㅡㅡ;;)


anarch

Learn to use the Scala interpreter

 
   scala> 1 + 2
   res0 : Int = 3
  • value name(res0) : type (Int)
  • packaging
    • global namespaces
      • scala._
      • System.out._

Define some variables

  • vals and vars

    • val은 Java의 final variable와 비슷하다.
      • 생성되면, 재할당 할수 없다.
    • var는 Java의 non-final 변수와 흡사.
  • type inference

    • 타입을 작성하지 않으면, scala가 타입을 추론한다.
    • 단, 함수의 인수는 타입이 있어야 한다. (return type은 아니다)

Define some functions


def max(x:Int,y:Int) : Int = {
   if (x>y) x
   else y
}
  • 함수의 인자는 타입을 함께 작성해야 한다.

Write some Scala scripts

  • command-line 인수는 args라는 scala array으로 통해 사용 할수 있다.
  • scala array은 zero-based이고, ()으로 각 요소를 접근 할 수 있다. []이 아니다.
  • 주석은 //,/* .. */

Loop with while; decide with if

var i = 0
while (i < args.length) {
    if (i != 0)
        print(" ")
    print(args(i))
    i += 1 
}
println()
  • block : while의 {}
    • block안에 한 문장만 있다면 {}을 생략 할 수 있다.
  • while,if의 ()에는java처럼 boolean expression을 넣어야 한다.
  • 루비처럼 if i < 10 은 안된다.
  • 자바처럼 문장의 끝에 ;으로 끝낼수 있다.

Iterate with foreach and for

  • imperative style
    • 다른 function사이에서 mutable state을 변경을 가하게 된다.
    • scala는 imperative style이 가능하지만, functional style도 가능하다.

    args.foreach(arg => println(arg))
    args.foreach((arg:String) => println(arg))
    args.foreach(println)
  • function literal

    • 괄호 안에 인자 이름, 오른쪽 화살표, 펑션 몸체로 구성
    • args의 foreach에 function을 인수로 전달한다.

    for(arg <- args) println(arg)

  • for expression

    • python의 list comprehesion과 흡사하다.
    • arg는 var가 아니고 val이다.
      • for block안에서 arg을 변경 할 수 없다.
Clone this wiki locally