5장 basic types and operations - codeport/scala GitHub Wiki

###5.1 Some basic types

  • integral types : Byte, Short, Int, Long, Char
  • numeric types : integral types + Float, Double
  • scala 패키지와 java.lang 패키지는 스칼라 소스 파일에 자동으로 import되어 있다.
  • 스칼라 컴파일러는 스칼라의 value types을 자바의 primitive types로 변환시킬 수 있다.

###5.2 Literals

A literal is a way to write a constant value directly in code.

  • Integer literals
  • Floating point literals
  • Character literals
  • String literals
  • Symbol literals
  • Boolean literals

###5.3 Operators are methods

  • prefix operators

    +, -, !, ~

  • *의 경우, unary_*를 정의한다고 해도 prefix operator notation으로 사용할 수 없다. prefix operator로 사용될 수 있는 네 가지 identifiers 중에 하나가 아니기 때문이다. 만약에 *p 처럼 호출하려고 한다면 Scala는 이것을 *.p 처럼 해석할 것이지만 그것은 당신이 생각했던 결과는 아닐 것이다.

###5.4 Arithmetic operations

  • IEEE 754 remainder

scala> math.IEEEremainder(11.0 , 4.0)

res14: Double = -1.0

  • 부동 소수점에 % 연산자를 호출한 결과 값은 IEEE 754 표준에 정의된 remainder가 아니다. 그래서 정수 %(remainder) operator와 전혀 다른 결과가 나올 것이다.

kingori

###5.1

  • String 은 java.lang 패키지
  • 나머지 기본 타입은 scala 패키지
  • scala의 기본 타입의 range는 자바의 기본 타입의 range와 같음

###5.2

  • 리터럴을 다루는 syntax는 java와 동일하지만, scala는 추가적인 syntax 제공 ** """ -> raw string. newline, quotation mark, special character 포함 가능. 들여쓰기 줄의 leading space를 없애기 위해선 각 줄 앞에 | 를 붙인 후, stripMargin 메서드를 호출함 (pg. 79)

  • symbol literal: '가 앞에 붙은 리터럴(alphanumeric만 허용한다고 하니 _, * 등의 특수기호는 못쓰는 듯?) type은 Symbol. 단순히 identifier를 생성해 주는 역할인 듯? ** symbol 은 interned. 즉, 여러 번 심볼을 언급해도 모두 동일한 instance를 가리킴. 자바 string의 intern() 메서드 호출 결과와 동일한 듯.

    val s='aSymbol -> val s= Symbol("aSymbol") -> s:Symbol = 'aSymbol

###5.3

  • 메서드 호출 시 . 를 빼도 되는 건 알고 있었는데, argument가 여러개일 경우 ( ) 앞에도 공백을 넣을 수 있구나.

    s indexOf ('o' , 5 ) -> s.indexOf('o,'5)

  • . 빼고 호출하는 형태를 operator notation이라고 하나 봄. (pg 82, 중간 회색 박스)

  • operator notation. prefix와 postfix는 unary. unary operator 선언 시엔 unary_ 를 붙여야 함.

  • infix: 객체와 매개변수 사이에 메서드가 위치. ex) 3.+(4)

  • prefix: 호출 객체 앞에 메서드가 위치. +, -, !, ~ 만 쓸 수 있음. ex) -7 -> 7.unary_-

  • postfix: 객체 뒤에 메서드가 위치. ex) 7 toLong <- 이건 형태만 보면 인자 없는 infix랑 같지 않나? 설명도 그렇게 나온 듯.

###5.4

부동소수점 숫자에 대해 % 연산자를 실행할 경우, IEEE 754에선 rounding division을 쓴다고 한다. (뭔 소린지?) 하여간 결과가 이렇게 나온다고 함. 근데 쓸 덴 없을 듯.

11.0 % 4.0 -> 3.0
math.IEEEremainder(11.0, 4.0) -> -1.0

###5.5

logical-and 와 logical-or 는 자바와 동일하게 short-circuited. 어떻게 이게 가능한가는 Section 9.5의 by-name parameter를 보라고 함. && 도 메서드라면 java 같은 경우 호출 시점에 모든 parameter가 eval되어야 하는데 scala에선 by-name parameter 덕분에 선택적으로 eval할 수 있음.

질문: chap. 9.5 의 설명을 보면 byNameAssert(5>3) 에서 apply 메서드로 5>3 이 eval 된다고 하는데 왜 apply 메서드가 실행되는가?

###5.6

이건 뭐 언제 쓸 일 있을까?

###5.7

==가 동치성 비교. 자바에선 ==는 참조 동일성 비교인 점에서 주의가 필요할 듯. (pg 90, 회색박스 참고) == 는 내부적으로 null 체크와 equals 호출을 병행함.

  1. 좌변이 null인지
  2. null 아니면 equals 호출.

참조 동일성 비교를 위한 method는 eq, ne 임. 단, 이 메서드들은 Java 객체에 directly map된 객체에만 쓸 수 있다고 함. (쓰지 말라는 소린가?)

###5.8

연산자 우선순위는 java와 비슷한 듯. 다만 :로 끝나는 연산자의 경우, 우에서 좌로 grouping됨. a:::b:::c -> a:::(b:::c)

###5.9

implicit conversion을 이용한 다양한 rich wrapper가 제공됨. 야호!

Outsider

5.1 Some basic types

  • Byte, Short, Int, Long, Char는 integral type이라고 부른다
  • integral type과 Float, Double를 numeric type이라고 부른다.
  • scala와 java.lang는 자동으로 모든 Scala코드에 임포트된다.

5.2 Literals

  • 0x,0X로 시작하는 숫자는 16진수이다.

  • 0으로 시작하는 숫자는 8진수이다.

  • 0으로 시작하지 않는 숫자는 10진수이다.

  • integer 리터럴이 L이나 l로 끝나면 Long이다.

  • Floating point 리터럴은 숫자와 부가적으로 소수점, E, e가 포함된다.

  • F나 f로 끝나면 floating-point 리터럴이고 그렇지 않으면 Double인데 Double은 D나 d로 끝날 수 있다.

  • Character 리터럴은 따옴표안에 유니코드로 작성한다. \나 \u로 유니코드로 작성할 수 있다.

  • String 리터럴은 쌍따옴포로 문자열을 감싼다.

  • """ """처럼 따옴표 3개로 로우스트링을 만들 수 있다.

    • stripMargin으로 공백문자를 제거할 수 있다.

    """|text""".stripMargin

  • symbol 리터럴은 `ident처럼 작성한다. ident는 어떤 알파벳도 가능하다.

  • boolean 리터럴은 true와 false이다.

5.3 Operators are methods

  • 오퍼레이터 노테이션으로 작성할때 아규먼트가 여러개이면 반드시 괄호로 감싸야 한다.
    • s indexOf ('o', 5)
  • prefix나 postfix 오퍼레이터는 unary이고 연산자를 1개만 갖는다.
    • 오퍼레이터 문자에 unary_가 앞에 붙는다.
    • -2.0은 (2.0).unary_-가 된다.
  • postfix 오퍼레이터는 아규먼트가 없다

5.4 Arithmetic operations

5.5 Relational and logical opeerations

5.6 Bitwise operations

  • bitwise-and(&), bitwise-or(|), bitwise-xor(^), bitwise complement operator(~)가 있다.
  • shift left(<<), shift right(>>), unsigned shift right(>>>)가 있다.

5.7 Object equality

  • 동등 비교에 ==를 사용할 수 있다.
    • 좌측인 null인지를 검사한다.
    • null이 아니면 equals를 호출한다.
    • 객체에서 자바에서 ==는 같은 참조인지를 비교하지만 스칼라에서는 참조비교를 위해서 eq를 제공한다.

5.8 Operator precedence and associativity

  • 메서드 이름으로 우선순위를 갖는다.
  • :로 끝나면 right to left로 호출한다.

5.9 Rich wrappers

질문

  • bit는 잘 모르겠다 ㅠㅠ
  • 136p 모르겠음