캡슐화(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가 곧 외부에 노출되는 필드가 됨