원칙에 너무 집착하는 것은 좋지 않지만, 어느 정도의 설계 방침으로 삼아 개발한다면 도움이 될 것이다.
객체 내부의 변수 또는 구현 상세를 사용자로부터 은폐하는 것
멤버변수를 private 하는 것만이 캡슐화가 아님
사용자는 public 멤버함수만 보이는데, 적절한 동작이 보장되어 클래스가 어떤 멤버변수를 가지고, 어떤 방식으로 구현되는지 알 필요가 없게 구현하는 것이 바람직함
getter(), setter() 멤버함수를 만들면 클래스의 내부 구조가 외부에 노출되기 때문에, 캡슐화가 무너진다. 따라서, getter(), setter() 멤버함수는 되도록 만드는 것을 피하는 것이 좋음
클래스의 멤버변수를 변경할 때는 멤버변수가 있는 클래스에서 모두 처리하게 하자. ("직접하지 말고 명령하라"라는 객체 지향 설계의 원칙)
상속관계일 경우에도 protect보다는 가능한 private로 만들자.
추상 인터페이스를 사용하면 좋은 캡슐화를 실현 가능함, 추상 인터페이스 사용자는 구현하는 클래스의 상세를 완전히 은폐할 수 있으므로 캡슐화가 가능함 사용자는 추상 인터페이스(의 멤버함수) 밖에 볼 수 없고, 클래스의 상세(구현 클래스)는 캡슐화됨
캡슐화의 큰 장점은 캡슐 내에 변경이 발생해도 캡슐 밖에는 영향을 주지 않음 (변경에 의한 영향 범위를 최소화 가능)
클래스는 객체의 복잡한 부분을 캡슐 내부에 몰아넣어, 사용자 입장에서 단순하게 보이도록 하는게 좋음 즉, 객체 내부 구조를 신경 쓰지 않아도 쉽게 사용할 수 있는 클래스 설계가 중요
캡슐화의 목적
객체 내부의 상태를 보호
객체 내부의 상세를 은폐