-
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
- java.long 패키지의 String을 제외한 모든 타입은
scala패키지에 있다.- Int는 scala.Int
-
scala패키지와java.lang패키지는 스칼라 소스 파일에 자동으로 import되여서 간단하게 Int만 사용 가능. - 스칼라의 기본 타입은 Java의 타입과 범위가 똑같다.
- 스칼라 컴파일러는 스칼라의 value types을 자바의 primitive types로 변환시킬 수 있다.
###5.2 Literals
모든 기본값은 Literal로 나타낼 수 있다. Literal은 constant value를 코드에 직접쓰는 방법이다.
(ex: 1, "One", (x: Int) => x + 1
- Integer literals
- Int, Long, Short, Byte 타입에 대한 리터럴
- decimal, hexadecimal, octal 3가지 형식이 있다.
-
0x나0X로 시작하면 hexadedemical이다.(16진수)
scala> val hex = 0x5
hex: Int = 5
scala> val hex2 = 0x00FF
hex2: Int = 255
scala> val magic = 0xcafebabe
magic: Int = -889275714
- 0으로 시작하면 octal이다.(8진수)
scala> val oct = 035 // (35 octal is 29 decimal)
oct: Int = 29
scala> val nov = 0777
nov: Int = 511
scala> val dec = 0321
dec: Int = 209
- 0이 아닌 숫자로 시작하면 demical이다.(10진수)
scala> val dec1 = 31
dec1: Int = 31
scala> val dec2 = 255
dec2: Int = 255
scala> val dec3 = 20
dec3: Int = 20
- `L`이나 `l`으로 끝나면 Long이다.
scala> val prog = 0XCAFEBABEL
prog: Long = 3405691582
scala> val tower = 35L
tower: Long = 35
scala> val of = 31l
of: Long = 31
- Floating point literals
- F나 f로 끝나면 Float고 그렇지 않으면 Double이다.
- Double 리터럴에 D나 d를 붙힐 수 있다.
- Character literals
- 따옴표사이에 유니코드 문자로 표시함
-
'\101'로 8진수나'\u0041'처럼 16진수로 유니코드 표시가능
- String literals
- 쌍따옴표로 표시한다.
- 세 따옴표로 여러라인에 걸쳐서 표시할 수 있다.
println("""Welcome to Ultamix 3000.
Type "HELP" for help.""")- 중간에 공백을 제거하면 파이프와 `stripMargin`을 사용한다.
println("""|Welcome to Ultamix 3000.
|Type "HELP" for help.""".stripMargin)- Symbol literals
- 심볼리터럴은
'ident로 작성하고 여기서ident는 알파벳이다. - 이러한 리터럴은
scala.Symbol의 인스턴스와 매핑된다. -
'cymbal은Symbol("cymbal")를 호출한다.
- 심볼리터럴은
scala> val s = 'aSymbol
s: Symbol = 'aSymbol
scala> s.name
res20: String = aSymbol- 같은 심볼리터럴을 두번 상용하면 같은 `Symbol`객체를 참조한다.
- Boolean literals
-
true와false가 있다.
-
###5.3 Operators are methods
-
prefix operators
+, -, !, ~
-
1 + 2는(1).+(2)이다. -
오퍼레이터 노테이션으로 여러 인자를 받으면 항상 괄호를 써야한다.
-
모든 메서드는 오퍼레이터가 될 수 있다.
-
s.indexOf('o')에서indexOf는 오퍼레이터가 아니지만s indexOf 'o'에서indexOf는 오퍼레이터다.
-
-
prefix/postfix 연잔사는 unary다. 피연산자를 하나만 받는다.
-
infix 연산자처럼 prefix 연산자는 메서드를 호출한다. 즉
-2.0은(2.0).unary_-가 된다. -
*의 경우, 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와 전혀 다른 결과가 나올 것이다.
###5.5 Relational and logical operations
###5.6 Bitwise operations
###5.7 Object equality
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로 호출한다.