Programming in Sala 책으로 스칼라 스터디하면서 정리했던 내용이다. 지금은 3판 번역본도 나왔지만, 약간 앞서서 스터디를 시작해서 2판으로 진행했다.

11장

클래스 계층 구조

Any

최상위 클래스

  • final def ==(that: Any): Boolean : equals
  • final def !=(that: Any): Boolean : not equals
  • def equals(that: Any): Boolean
  • def ##: Int : hashCode
  • def 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


+ Recent posts