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]
'scala' 카테고리의 다른 글
[scala] main 메소드 argument 처리 (0) | 2016.09.08 |
---|---|
[scala] import 문 팁 - import static/import rename (0) | 2016.09.08 |
[scala] map, flatten, flatmap 예시 (0) | 2016.09.08 |
[scala] 여러 줄을 출력하기(print multi line ) (0) | 2016.09.07 |
[scala] tuple, _1, match 예시 (0) | 2016.09.07 |