Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- Play2 로 웹 개발
- 플레이프레임워크
- hyperledger fabric
- 그라파나
- CORDA
- 스칼라
- 스위프트
- akka 강좌
- 파이썬
- play2 강좌
- 파이썬 강좌
- 스칼라 동시성
- 주키퍼
- Akka
- 블록체인
- 하이퍼레저 패브릭
- play 강좌
- 이더리움
- 엔터프라이즈 블록체인
- Golang
- Actor
- Adapter 패턴
- Hyperledger fabric gossip protocol
- 파이썬 데이터분석
- 스칼라 강좌
- 안드로이드 웹뷰
- Play2
- 파이썬 머신러닝
- 하이브리드앱
- 파이썬 동시성
Archives
- Today
- Total
HAMA 블로그
스칼라 강좌 (18) -trait 본문
trait
* Scala 는 interface 가 없으며 대신 trait 을 사용한다.
* Scala 의 trait 는 자바의 interface 와 달리 구현 가능하다. (자바8 부터는 자바인터페이스도 디폴트메소드등 구현)
* 하나의 부모클래스를 갖는 클래스의 상속과 달리 트레이트는 몇개라도 조합해 사용 가능하다.
* Scala 의 trait 는 자바의 인터페이스와 추상클래스의 장점을 섞었다.
* 트레이트를 믹스인 할때는 extends 키워드를 이용한다.
* extends 를 사용하면 trait 의 슈퍼클래스를 암시적으로 상속하고 , 본래 trait 를 믹스인한다.
* trait 는 어떤 슈퍼클래스를 명시적으로 상속한 클래스에 혼합할 수 있다.
그때 슈퍼클래스는 extends 를 사용하고, trait 는 with 로 믹스인한다.
예1)
trait Car {
val brand: String
}
trait Shiny {
val shineRefraction: Int
}
class BMW extends Car {
val brand = "BMW"
}
클래스는 여러 트레잇를 with
키워드를 사용해 확장할 수 있다.
class BMW extends Car with Shiny {
val brand = "BMW"
val shineRefraction = 12
}
예2)
trait Philosophical {
def philosophize() {
println("I consume memory, therefore I am!")
}
}
Listing 12.1 - The definition of trait Philosophical.
class Frog extends Philosophical {
override def toString = "green"
}
Listing 12.2 - Mixing in a trait using extends.
scala> val frog = new Frog
frog: Frog = green
scala> frog.philosophize()
I consume memory, therefore I am!
scala> val phil: Philosophical = frog
phil: Philosophical = green
scala> phil.philosophize()
I consume memory, therefore I am!
class Animal
class Frog extends Animal with Philosophical {
override def toString = "green"
}
Listing 12.3 - Mixing in a trait using with.
class Animal
trait HasLegs
class Frog extends Animal with Philosophical with HasLegs {
override def toString = "green"
}
Listing 12.4 - Mixing in multiple traits.
class Animal
class Frog extends Animal with Philosophical {
override def toString = "green"
override def philosophize() {
println("It ain't easy being "+ toString +"!")
}
}
scala> val phrog: Philosophical = new Frog
phrog: Philosophical = green
scala> phrog.philosophize()
It ain't easy being green!
trait 는 클래스를 정의하면서 할 수 있는 모든것을 할 수 있다.
문법 경우 2가지를 제외하고 정확히 같다.
첫째. 트레이트는 '클래스' 파라미터를 가질 수 없다.
둘째 클래스는 super 호출을 정적으로 바인딩하지만, 트레이는 동적으로 바인딩한다.
class Point(x: Int, y: Int)
trait NoPoint(x: Int, y: Int) // trait 는 클래스 파라미터를 가질수 없다.
trait vs 추상클래스
스택 오버플로우에서 아래를 참고 하라.
트레잇과 추상 클래스의 비교,
추상 클래스와 트레잇의 차이,
스칼라 프로그래밍: 트레잇냐 아니냐 그것이 문제로다?
자바8에서 인터페이스 기능이 대폭 증가한것을 기점으로 스칼라 trait vs 자바 interface 비교를 해야 할 듯싶다.
Orderd trait
class Rational(n: Int, d: Int) { // ... def < (that: Rational) = this.numer * that.denom > that.numer * this.denom def > (that: Rational) = that < this def <= (that: Rational) = (this < that) || (this == that) def >= (that: Rational) = (this > that) || (this == that) }
class Rational(n: Int, d: Int) extends Ordered[Rational] { // ... def compare(that: Rational) = (this.numer * that.denom) - (that.numer * this.denom) }
scala> val half = new Rational(1, 2) half: Rational = 1/2
scala> val third = new Rational(1, 3) third: Rational = 1/3
scala> half < third res5: Boolean = false
scala> half > third res6: Boolean = true
trait Ordered[T] { def compare(that: T): Int
def <(that: T): Boolean = (this compare that) < 0 def >(that: T): Boolean = (this compare that) > 0 def <=(that: T): Boolean = (this compare that) <= 0 def >=(that: T): Boolean = (this compare that) >= 0 }
'Scala' 카테고리의 다른 글
스칼라 강좌 (20) - 고차함수들 (zip,map,flatmap등) (0) | 2016.08.14 |
---|---|
스칼라 강좌 (19) - implicit (0) | 2016.08.13 |
스칼라 강좌 (17) - case class (0) | 2016.08.06 |
스칼라 강좌 (16) - Enumerations (열거) (0) | 2016.08.06 |
스칼라 강좌 (15) - Getter / Setter (0) | 2016.07.31 |
Comments