본문 바로가기

Development/Programming

[Scala] Mixin Class Composition

각각의 다른 정의가 이루어진 클래스를 하나로 합치는 방법이다.

AbsIterator 클래스를 상속 받아서 2개의 클래스가 정의가 된다.


  1. abstract class AbsIterator {
  2. type T
  3. def hasNext: Boolean
  4. def next: T
  5. }


foreach를 구현한 클래스와


  1. trait RichIterator extends AbsIterator {
  2. def foreach(f: T => Unit) { while (hasNext) f(next) }
  3. }


String을 사용하는 클래스


  1. class StringIterator(s: String) extends AbsIterator {
  2. type T = Char
  3. private var i = 0
  4. def hasNext = i < s.length()
  5. def next = { val ch = s charAt i; i += 1; ch }
  6. }


위의 2개의 클래스를 Java에서는 합쳐서 사용하기는 불가능하다 왜냐하면 같은 클래스를 상속 받은 상태이기 때문이다. 개인적인 생각으로는 다중 상속의 위험성 때문에 단일 상속만 지원하는 언어가 많은데 잘 사용만 하면 편하기 떄문에 Scala에서는 이렇게 해결한 것 같다.


아래는 2개의 클래스를 합치는 코드이다.


  1. object StringIteratorTest {
  2. def main(args: Array[String]) {
  3. class Iter extends StringIterator("aaaaaa") with RichIterator
  4. val iter = new Iter
  5. iter foreach println
  6. }
  7. }