Study with book/Programming in Scala

scala trait vs kotlin interface


캡슐화(encapsulation) 관점에서 보면 Scala의 trait와 Kotlin의 interface는 내부 구현(특히 상태와 헬퍼 로직)을 얼마나 감출 수 있느냐에 큰 차이가 있습니다.

 


 

상태(state) 은닉과 접근 제어

scala trait

    • val/var 필드를 직접 선언하고, private 또는 private[this] 로 접근을 제한할 수 있습니다.
    • 메서드도 private[packagename], protected 등 세밀한 가시성을 줄 수 있어서, 외부에는 오직 “공개하고 싶은 시그니처”만 보이도록 설계할 수 있습니다.
trait Counter {
  private var count: Int = 0         // 외부에서 보이지 않는 상태
  def inc(): Unit = count += 1
  def get: Int      = count
}

class MyService extends Counter // MyService 외부에서는 Counter.count에 접근 불가

 

 

kotlin interface

  • 상태 보관(backing field) 자체가 불가능하므로, 캡슐화할 필드가 없습니다.
  • 프로퍼티 선언은 가능하지만, 실제 저장은 구현체에 위임됩니다.
  • public·private 메서드는 쓸 수 있지만, protected는 불가능하고 상태가 없으므로 은닉할 게 제한적입니다.
  • 기본 구현(default method) 역시 모두 바이트코드에 드러나므로, 완전한 은닉을 기대하긴 어렵습니다.
interface Counter {
  var count: Int               // 인터페이스 자체엔 필드가 없음
  fun inc() { count += 1 }     // 상태는 구현 클래스에서 관리
  fun get(): Int = count
}
class MyService(override var count: Int = 0) : Counter
// Counter 인터페이스엔 숨겨진 상태가 없고,
// MyService.count가 곧 외부에 노출되는 필드가 됨