코틀린

디미터의 법칙

pjm1n 2025. 3. 30. 21:54

“객체는 직접적인 친구하고만 대화해야 한다.”

즉, 객체 내부의 내부까지 접근하면 안 된다.

❌ 디미터의 법칙을 어긴 코드

class Engine {
    fun getHorsePower(): Int = 300
}

class Car(val engine: Engine)

class Driver(val car: Car) {
    fun showHorsePower() {
        println("마력: ${car.engine.getHorsePower()}") // 디미터 법칙 위반
    }
}

🔴 문제점:

Driver 객체에서 너무 많은 것을 알고 있다. (Car객체 뿐만 아니라, Engine객체 까지 알고 있음.)

→ 유지보수가 어려워지고 결합도가 높아진다. Car 객체 내부가 바뀌면 Driver객체도 수정을 해야함.

✅ 디미터의 법칙을 준수한 코드

class Engine {
    fun getHorsePower(): Int = 300
}

class Car(private val engine: Engine) {
    fun getHorsePower(): Int = engine.getHorsePower() // 엔진 정보를 캡슐화
}

class Driver(private val car: Car) {
    fun showHorsePower() {
        println("마력: ${car.getHorsePower()}") // 디미터 법칙 준수
    }
}

🚀 결론

  1. 객체는 자신이 직접 소유한 것과만 상호작용해야 한다.
  • 즉, 자신의 메서드, 필드, 생성된 객체, 파라미터로 전달된 객체만 사용해야 한다.
  1. 연쇄적인 호출(Chained Call)을 피해야 한다.
  • car.engine.getPower()같은 방식은 디미터 법칙을 위반하는 코드다.
  1. 객체 간의 의존성을 줄여야 한다.
  • 특정 객체의 내부 구조가 변경되더라도 영향을 최소화할 수 있다.