최소 지식 원칙이라고도 하고 데메테르의 법칙 이라고도 합니다. 둘 다 같은 말이지만 책에서는 법칙이라고 하기보단 원칙이라는 말이 더 어울리고 최조 지식이라는 말이 원리를 더 잘 나타내고 있기 때문에 최소 지식 원칙이라는 말을 사용하기로 했답니다.

디자인 원칙
최소 지식 원칙 - 정말 친한 친구하고만 얘기하라.

인연을 많이 맺으면 맺을 수록 인생이 고달파 지기 때문에 되도록이면 인연을 맺지 않으면서 다른 객체들에게 영향력을 행사하는 방법으로 네가지가 있습니다.

  • 객체 자체의 매소드 호출
  • 메소드에 매개변수로 전달된 객체의 메소드 호출
  • 그 메소드에서 생성하거나 인스턴스를 만든 객체
  • 그 객체에 속하는 구성요소

이렇게 책에는 씌여있는데 영회 형의 옛날 블러그를 통해 찾은 c2.com에 있는 문서에 보면 다음과 같이 나와 있습니다.

  • You can play with yourself.
  • You can play with your own toys (but you can't take them apart),
  • You can play with toys that were given to you.
  • And you can play with toys you've made yourself.

순서가 조금 바꼈지만 무엇이 무엇을 번역한 것인지는 대충 짐작이 갈 것입니다. c2.com에 있는 문서에 보시면 약간 더 풀어서 설명한 글을 제공해 줍니다.

이 원칙을 위배하는 것 중에 가장 눈에 잘 띄는 모양은 줄줄이 비핸나 쏘세지 입니다. 그리고 객체 없이 그냥 호출하는 static 메소드들(facotory 패턴의 메소드나, singleton 패턴에 있는 메소드)입니다.

책에 나온 예제 소스코드 입니다.
[#M_ more.. | less.. |
public class Car {
   Engine engine;
   // 기타 인스턴스 변수

   public Car(){
       // 엔진 초기화 등을 처리
   }

   public void start(Key key){
       Doors doors = new Doors();

       boolean authorized = key.turns();
       if (authorized) {
           engine.start();
           updateDashboardDisplay();
           doors.lock();
       }
   }

   public void updateDashboardDisplay(){
       // 디스플레이 갱신
   }
}
_M#]
색칠 된 부분 모두 원칙에 위배되지 않습니다. 분홍색 부분은 두번째 줄에 해당하고 하늘색 부분은 세번째 줄에 해당하고 녹색은 네번째 줄에 해당하고 노란색은 첫번째 줄에 해당합니다.

위배되는 경우의 코드를 보겠습니다.
[#M_ more.. | less.. |
public House {
   WeatherStation station;
   // 기타 메소드 및 생성자
  
   public float getTemp( {
      return station.getThermometer().getTemperature();
   }
}
_M#]
분홍색 부분이 이 원칙을 배신하고 있습니다. 객체에 연쇄적으로 메소드를 호출하게 됐을 때.. 즉 위의 경우 getThermomoeter()를 호출 했을 때 받아오는 객체의 내용이 만약 바뀌게 된다면 잇따라 호출한 getTemperature() 메소드를 호출하지 못할 수도 있는 경우가 발생할 수도 있겠지요. 영회형 블러그에 있던 글을 인용하자면

그렇게 되면 설계 과정에서 관계가 강하지 않다고 떼어놓은 것에
다시 결합도(coupling)을 부여하는 결과가 되니까..

1100151547.bmp이런 모양을 원했는데...

1293707849.bmp요로케 된다는 뜻이 아닐까.. 생각해 봅니다.

위의 코드를 아래와 같이 수정하면 원칙을 따르게 됩니다.
[#M_ more.. | less.. |

public House {
   WeatherStation station;
   // 기타 메소드 및 생성자
  
   public float getTemp( {
      Thermometer thermometer = station.getThemometer();
      return getTempHelper(themometer);
   }

   private float getTempHelper(Themometer thermometer) {
      return thermometer.getTemperature();
   }
}
_M#]

볼 거리 :
http://www.headfirstlabs.com/phpBB2/viewtopic.php?p=590&sid=70caa5b5a3b7d4ea2ed2d8e79a938635
-> 책의 이 부분에 대한 head first 포럼에 올라왔던 글입니다. 별로 재밌진 않네요. -_-;;
영회 형 예전 블러그의 글
-> 재밌지요. 다른 원칙들도 같이 정리되어 있습니다.
c2.com에 있는글
-> 이만한 자료를 찾을 수가 없었습니다. 더 좋은 자료 찾으시면 알려주세요.