Unit은 아무 것도 리턴하지 않음을 의미하는 메소드 리턴 타입이다.
def run(): Unit = {
}
Unit은 AnyVal을 상속했다.
final abstract class Unit private extends AnyVal
null은 자바의 null과 동일하지만,
Null은 null이라는 값을 가진 trait이며, 타입 매개변수를 제약하는 데 쓰인다.
implicit def nullMember[B >: Null] = new Member[B] { def apply = null }
Nothing은 trait이며, Option의 타입 매개변수로 쓰인다. 그리고 인스턴스가 없다.
case object None extends Option[Nothing] {
Nothing은 모든 클래스를 상속받을 수 있다. 즉 바닥 타입(bottom type)이라 한다.
http://www.scala-lang.org/api/current/index.html#scala.Null
None은 NPE를 해결하기 위핸 Option 래퍼이다.
val opt: Option[String] = None
참고로 Option은 Some과 None이라는 하위 클래스가 있다.
final case class Some[+A](x: A) extends Option[A]
Nill은 엘리먼트가 하나도 없는 리스트를 의미한다.
println (Nil == List())
null은 좀 특이하다. 스칼라 컴파일러가 마음대로 적용하는 것 같다.
println(null.asInstanceOf[Double])
NPE가 발생하지 않고 null이 출력된다.
스칼라 컴파일러가 만든 JVM 바이트 코드는 다음코드로 번역된다.
scala.this.Predef.println(null);
만약 toString을 호출하면, NPE가 발생한다.
println(null.toString)
스칼라 컴파일러가 만든 JVM 바이트 코드는 다음코드로 번역된다.
scala.this.Predef.println(null.toString());
아래 코드를 보면 더욱 재미있다. 결국 문맥에 따라 스칼라 컴파일러가 다르게 변경될 수 있다.
scala> null.asInstanceOf[Int]
res2: Int = 0
scala> println(null.asInstanceOf[Int])
null
'scala' 카테고리의 다른 글
[scala] vararg, _* 타입 어노테이션 (0) | 2016.09.28 |
---|---|
[scala] lazy, view (0) | 2016.09.28 |
[scala] self/ this와 Injection(Cake Pattern,케이크 패턴) (0) | 2016.09.27 |
[scala] sugar 의미 (0) | 2016.09.27 |
[scala] 패턴 매칭 (pattern matching) 성능 주의 사항 (0) | 2016.09.26 |