11장 scala's hierarchy - codeport/scala GitHub Wiki

11.0

kingori

  • 모든 클래스는 Any 라는 클래스를 상속함 (자바의 Object와 같이) - common superclass
  • 자바엔 없는 밑바닥 클래스도 있음 (Null, Nothing) - common subclass

nephilim

  • 일단 merge 시 충돌을 야기하여 오리대마왕님의 독주를 견제.

11.1 Scala's class hierarchy

kingori

  • Any
    • == : equals와 동일하게 동치비교. java의 경우 primitive일 경우엔 ==, object일 경우엔 equals() 에 대응. cf. !=
      • == 과 != 는 final: subclass가 override할 경우 사용하는 사람이 혼란스러울 수 있어 이를 방지함
    • ##: hashcode. wrapper class들의 hashcode는 자바와 달리 값이 같으면 동일함
scala> ( 3L.## ) == (3.##)
res14: Boolean = true
  • AnyVal: scala의 build-in value class의 부모.
    • Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit <- Unit도 여기 껴주는구나!
      • 이들 value class끼리는 상속 관계를 가지지 않음
    • new로 instance를 생성하지 못함.
    • 질문 : 그럼 사용자는 AnyVal의 subclass를 만들 수 없나? AnyVal은 그냥 사용만 해야 하는지?
  • AnyRef: reference class의 base class. 실질적인 자바의 Object 역할을 함.
    • Scala에서도 자바의 Object를 쓸 수 있지만 일관성을 위해 Scala 쓸 것!

nephilim

  • 참고: ScalaObject
    • 사용자가 정의한 모든 class는 암시적으로 scala.ScalaObject라는 trait를 구현하게 되어있음
    • ScalaObject는 $tag를 추가하는데 2.7에서는 패턴 매칭의 효율을 높이기 위해 사용되었으나, 2.8에서는 내용이 없음

zeide

  • implicit conversions가 있다. (21장에서 자세하게 나옴)

11.2 How primitives are implemented

kingori

  • java에선 개발자가 boxing 을 신경 많이 써야 하나, scala에선 좀 덜 써도 됨
    def isEqual(x: Any, y: Any ) = x == y /primitive던 아니던 일관성 있게 사용 가능
cf) java
    boolean isEqual(Integer x, Integer y ) { return x.equals(y);}
    boolean isEqual(int x, int y ) { return x == y;}
  • AnyRef는 동일비교(refernece 일치)를 위한 별도의 eq도 제공. java의 ==에 해당함.

11.3 Bottom types

kingori

java엔 없는 개념. 뭔 class가 오던 난 그놈의 자식이여!

  • Null : null에 해당하는 타입. value type(즉 AnyVal의 subclass)엔 해당하지 않음
  • Nothing: 모든 type(Null 포함)의 subtype. value를 갖지 않는 type. abnormal termination signal 등의 특수한 용도로 사용함.
def error(message: String): Nothing = throw new RuntimeException(message)

nephilim

  • Bottom Type은 다음과 같이 Scala의 예외 처리에 활용된다.(위 error 메서드 참고)
def divide(x:Int, y:Int):Int = {
  if ( y != 0) x/y
  else error("Divide By Zero!")
}

11.4 Conclusion