-
Notifications
You must be signed in to change notification settings - Fork 36
11장 scala's hierarchy
nephilim edited this page Jun 10, 2012
·
1 revision
- 모든 클래스는 Any 라는 클래스를 상속함 (자바의 Object와 같이) - common superclass
- 자바엔 없는 밑바닥 클래스도 있음 (Null, Nothing) - common subclass
- 일단 merge 시 충돌을 야기하여 오리대마왕님의 독주를 견제.
- Any
- == : equals와 동일하게 동치비교. java의 경우 primitive일 경우엔 ==, object일 경우엔 equals() 에 대응. cf. !=
- == 과 != 는 final: subclass가 override할 경우 사용하는 사람이 혼란스러울 수 있어 이를 방지함
-
##
: hashcode. wrapper class들의 hashcode는 자바와 달리 값이 같으면 동일함
- == : equals와 동일하게 동치비교. java의 경우 primitive일 경우엔 ==, object일 경우엔 equals() 에 대응. cf. !=
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은 그냥 사용만 해야 하는지?
- Byte, Short, Char, Int, Long, Float, Double, Boolean, Unit <- Unit도 여기 껴주는구나!
- AnyRef: reference class의 base class. 실질적인 자바의 Object 역할을 함.
- Scala에서도 자바의 Object를 쓸 수 있지만 일관성을 위해 Scala 쓸 것!
- 참고: ScalaObject
- 사용자가 정의한 모든 class는 암시적으로 scala.ScalaObject라는 trait를 구현하게 되어있음
- ScalaObject는 $tag를 추가하는데 2.7에서는 패턴 매칭의 효율을 높이기 위해 사용되었으나, 2.8에서는 내용이 없음
- implicit conversions가 있다. (21장에서 자세하게 나옴)
- 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의 ==에 해당함.
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)
- Bottom Type은 다음과 같이 Scala의 예외 처리에 활용된다.(위 error 메서드 참고)
def divide(x:Int, y:Int):Int = {
if ( y != 0) x/y
else error("Divide By Zero!")
}