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






Posted by '김용환'
,