-
Notifications
You must be signed in to change notification settings - Fork 36
5장 basic types and operations
###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 호출을 병행함.
- 좌변이 null인지
- null 아니면 equals 호출.
참조 동일성 비교를 위한 method는 eq, ne 임. 단, 이 메서드들은 Java 객체에 directly map된 객체에만 쓸 수 있다고 함. (쓰지 말라는 소린가?)
###5.8
연산자 우선순위는 java와 비슷한 듯. 다만 :로 끝나는 연산자의 경우, 우에서 좌로 grouping됨. a:::b:::c -> a:::(b:::c)
###5.9
implicit conversion을 이용한 다양한 rich wrapper가 제공됨. 야호!
- Byte, Short, Int, Long, Char는 integral type이라고 부른다
- integral type과 Float, Double를 numeric type이라고 부른다.
- scala와 java.lang는 자동으로 모든 Scala코드에 임포트된다.
-
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이다.
- 오퍼레이터 노테이션으로 작성할때 아규먼트가 여러개이면 반드시 괄호로 감싸야 한다.
- s indexOf ('o', 5)
- prefix나 postfix 오퍼레이터는 unary이고 연산자를 1개만 갖는다.
- 오퍼레이터 문자에 unary_가 앞에 붙는다.
- -2.0은 (2.0).unary_-가 된다.
- postfix 오퍼레이터는 아규먼트가 없다
- bitwise-and(&), bitwise-or(|), bitwise-xor(^), bitwise complement operator(~)가 있다.
- shift left(<<), shift right(>>), unsigned shift right(>>>)가 있다.
- 동등 비교에 ==를 사용할 수 있다.
- 좌측인 null인지를 검사한다.
- null이 아니면 equals를 호출한다.
- 객체에서 자바에서 ==는 같은 참조인지를 비교하지만 스칼라에서는 참조비교를 위해서 eq를 제공한다.
- 메서드 이름으로 우선순위를 갖는다.
- :로 끝나면 right to left로 호출한다.
- bit는 잘 모르겠다 ㅠㅠ
- 136p 모르겠음