Compare Scala trait to java interface


Categories: Programming Scala
Tags: #Java #Scala

Scala trait과 Java interface 비교

Java의 interface와 scala trait 둘 다 Class가 가지고 있는 특성을 추상화를 함. 그래서, 그에 대한 실제적 구현물은 interface 나 trait을 받는 쪽(implements, with)으로 맡길 수 있음. 하지만, (1.8 버전 미만의) Java interface 는 추상 메소드만 선언 가능하고, Scala trait 같은 경우는 trait 내에 추상 메소드 뿐만 아니라 실제 구현도 가능하다는 차이가 존재.

trait Hello {
  def printHello() = {
    println("Hello")
  }
}

object HelloImpl1 extends Hello
HelloImpl1.printHello()
// 콘솔 결과
// Hello

object HelloImpl2 extends Hello {
  override def printHello(): Unit = {
    println("Hello22")
  }
}
HelloImpl2.printHello()
// 콘솔 결과
// Hello22

object HelloImpl3 extends Hello {
  override def printHello(): Unit = {
    // 공통적으로 수행해야하는 내용이 trait 내에 존재
    super.printHello()
    // 구현체마다 다르게 실행되야하는 부분
    println("Hello22")
  }
}
HelloImpl3.printHello()
// 콘솔 결과
// Hello
// Hello22

trait에서 실제 구현도 가능하다는 점은 아래와 같은 점에서 편리함

  • HelloImpl1 구현체와 같이 별다른 구현이 필요 없을 경우 override 없이 기본으로 실행 가능 (HelloImpl2와 같이 다른 구현이 필요한 경우도 처리 가능)
  • HelloImpl3 구현체와 같이 구현체들이 공통적으로 수행해야하는 내용이 있을 경우, super를 통하여 공통 수행 부분을 호출 가능

Java는 interface에서 메소드 구현이 완전 불가능한건지 좀 더 찾아보니 java 1.8 버전부터는 default 라는 키워드로 interface 내에서도 메소드의 구현이 가능.

Comments