Programming in Sala 책으로 스칼라 스터디하면서 정리했던 내용이다. 지금은 3판 번역본도 나왔지만, 약간 앞서서 스터디를 시작해서 2판으로 진행했다.
11장
클래스 계층 구조
Any
최상위 클래스
final def ==(that: Any): Boolean
: equalsfinal def !=(that: Any): Boolean
: not equalsdef equals(that: Any): Boolean
def ##: Int
: hashCodedef hashCode: Int
def toString: String
자바(equals, hashCode)와 달리 스칼라(==, !=, ##)는 일관성을 위해 박싱 클래스를 특별 취급함
AnyVal, AnyRef
Any의 서브 클래스
AnyVal
모든 스칼라의 내장 값 클래스(Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit)의 부모 클래스
- Byte, Short, Char, Int, Long, Float, Double, Boolean
- 자바의 원시 타입에 대응
- 실행 시점에 자바 원시 타입 값으로 표현함
- new 를 사용하여 인스턴스화할 수 없음(추상클래스이며 final 클래스임)
- 암시적 변환 제공(widening)
- Int -> Long -> Float -> Double
- Char -> Int
- 더 많은 기능 제공을 위한 암시적 변환(scala.runtime.RichInt 등)
42 max 43 // 43
42 min 43 // 42
1 until 5 // Range(1, 2, 3, 4)
1 to 5 // Range(1, 2, 3, 4, 5)
3.abs // 3
(-3).abs // 3
- Unit
- 자바의 void 와 유사
- 값 :
()
AnyRef
모든 참조 클래스의 기반 클래스(java.lang.Object)
Nothing
모든 클래스의 서브클래스
기본 클래스 구현
- 표준 연산은 자바 기본 연산을 사용하지만, 객체가 필요한 경우 대응하는 클래스를 사용
- 값 타입의 경우,
==
는 자연적인 동일성(값을 비교)
// 자바 코드
boolean isEqual(int x, int y) {
return x == y;
}
isEqual(421, 421); // true
boolean isEqual2(Integer x, Integer y) {
return x == y;
}
isEqual2(421, 421); // false
// 스칼라 코드
def isEqual(x: Int, y: Int) = x == y
isEqual(421, 421) // true
def isEqual2(x: Any, y: Any) = x == y
isEqual2(421, 421) // true
- 참조 동일성 확인 :
eq
,ne
val x = new String("abc")
val y = new String("abc")
x == y // true
x eq y // false
x ne y // true
바닥에 있는 타입
scala.Null
- AnyRef를 상속한 모든 참조 타입의 서브 클래스
- 값 타입과는 호환되지 않음
val i: Int = null // error
scala.Nothing
- 모든 다른 타입의 서브 타입
def error(message: String): Nothing =
throw new RuntimeException(message)
def divide(x: Int, y: Int): Int =
if (y != 0) x / y
else error("can't divide by zero") // return Nothing for Int
'Developing' 카테고리의 다른 글
Programming in Scala 스터디 정리 - 12장. 트레이트 (0) | 2017.09.19 |
---|---|
Programming in Scala 스터디 정리 - 10장. 상속과 구성 (0) | 2017.06.16 |
Programming in Scala 스터디 정리 - 9장. 흐름 제어 추상화 (0) | 2017.06.15 |