trait는 자바의 interface와 비슷하지만, 내부 구현상 상속을 받으면서 abstract class 역할도 담당한다. 

sealed trait라는 것이 있어서 trait와 비교했다.



model.scala 라는 파일을 다음처럼 생성했다. 



model.scala

sealed trait Order {
def id: Int
def price: Double
}

trait Member {
def id: Int
def name: String
}

case class MemberOrder(id: Int, price: Double) extends Order

case class MemberObject(id: Int, name: String) extends Member


trait는 해당 파일 또는 다른 파일에서 사용할 수 있지만, sealed trait는 c의 static 처럼 해당 파일에서만 사용할 수 있다. 에러가 발생하지 않는다. 





test.scala 파일

case class AnotherMemberObject(id: Int, name: String) extends Member
// case class AnotherMemberOrder(id: Int, name: Double) extends Order // 에러 발생


Order는 sealed trait이기 때문에 외부 파일에서는 상속받을 수 없다. 


Error:(12, 62) illegal inheritance from sealed trait Order

case class AnotherMemberOrder(id: Int, name: Double) extends Order







 scala 내부에서 사용할 trait 또는 class를 sealed modifier를 사용하고, 외부로 오픈할 클래스를 final case class로 연동하기도 한다.




<List>

sealed trait List[+A] {

}

final case class ::[A](head: A, tl: List[A]) extends List[A]

final case class Nil extends List[Nothing]




<Option>

sealed abstract class Option[+A] extends Product with Serializable {

}


final case class Some[+A](x: A) extends Option[A]



<Try>


sealed abstract class Try[+T] {

}

final case class Success[+T](value: T) extends Try[T] 

final case class Failure[+T](exception: Throwable) extends Try[T]




Posted by '김용환'
,