아래의 글은 마틴 오더스키,렉스 스푼,빌 베너스 공저 / 오현석,이동욱,반영록 공역, 『Programming in Scala 3/e』,에이콘출판사(2017), CH01의 내용을 기반으로 작성하였습니다.

 

트레이트는 코드 재사용의 근간을 이루는 단위

트레이트로 메소드와 필드 정의를 캡슐화 하면 트레이트를 조합한 클래스에서 그 메소드나 필드를 재사용할 수 있다.

트레이트는 mix in 이 가능

  1. 간결한 인터페이스를 확장해 rich interface를 만드는 방법
  2. 쌓을 수 있는 변경을 정의 (stackable modification)

 

 

trait Phiosophical {

    def philosophize() = {

        println("I consume memory, therefor I am")

    }

}

 

 

class Animal

trait HasLegs

 

 

class Frog extends Animal with Philosophical with HasLegs {

    override def toString = "green"

}

 

트레이트는 클래스 파라메터를 가질 수 없다.

클래스는 super 호출을 정적으로 바인딩하지만 트레이트에서는 동적으로 바인딩 한다.

super.toString을 어떤 클래스에서 사용하면, 어떤 메소드 구현을 호출할지 정확히 알 수 있다.

하지만, 트레이느에서 super.toString을 작성해도 정의하는 시점에는 super가 호출할 실제 메소드 구현을 알 수 없다.

호출할 메소드는 트레이트를 mix in 할때마다 새로 정해진다. 이를 stackable modification

 

방법 1 풍부한 인터페이스

트레이트를 이용해 인터페이스를 풍부하게 만들고 싶다면, 트레이트에 간결한 인터페이스 역할을 하는 추상 메소드를 구현하고

풍부한 인터페이스 역할을 할 어려 메소드를 추상 메소드를 사용해 같은 트레이트 안에 구현하면 된다.

풍부해진 트레이트를 클래스에 믹스인 하고, 추상 메소드로 지정한 갈견한 인터페이스만 구현하면, 

결국 풍부한 인터페잇 구현을 모두 포함한 클래스를 완성할 수 있다

인터페이스에 디폴트 메소드 넣듯이...

 

방법 2. 변경 쌓아 올리기

 

abstract class IntQueue {

    def get(): Int

    def put(x: Int)

}

 

 

import scala.collection.mutable.ArrayBuffer

 

 

class BasiccIntQueue extends IntQueue {

    private val buf = new ArrayBuffer[Int]

    def get() = buf.remove(0)

    def put(x: Int) = {  buf += x }

}

 

 

trait Doubling extends IntQueue {

    abstract override def put(x: Int) = { super.put(2 * x) }

}

첫째는 슈퍼 클래스로 IntQueue를 선언한다는 것

이 선언은 Doubling 트레이트가 IntQueue를 상속한 클래스에만 믹스인 될 수 있음

두번째는 트레이트의 추상 메소드가 super를 호출한다는 점

일반적인 클래스는 이런식 호출은 실행시점에 호출 실패

하지만 트레이트에서는 호출을 동적으로 바인딩해서 Doubling을 put을 제공하는 트레이트나 클래스에 믹스인한다면 그때 해당 super.put 호출

 

믹스인 순서가 중요

가장 오른쪽의 트레이트를 먼저 호출

 

케이크 패턴 찾아보기

 

트레이트를 통한 다중 상속된 클래스 트레이트를 선형화 하여 차례로 super를 호출 및 누적

 

트레이트 or 추상클래스 가이드 라인

  1. 재사용할게 아니면 클래스
  2. 서로 관련이 없는 클래스에서 어떤 행위를 여러번 재사용하면, 트레이트
  3. 스칼라에서 정의하 내용을 자바 코드에서 상속, 추상 클래스
  4. 바이너리로 배포 및 누가 상속할거면, 추상 클래스
  5. 판단이 서지 않으면, 트레이트

+ Recent posts