마찬가지로 private과 protected를 이용해서 정보를 hiding 하는 것.
하지만 캡슐화는 이보다 더 객체를 좀 더 감싸서 여러가지 메서드 중 외부에 사용할 꼭 필요한 메서드 한 두개만 오픈하고 나머지는 자동으로 모든 것이 생성될 수 있도록 만드는 것.
정보를 감싸서 필요한 정보만 외부에 오픈한다!
클라이언트가 이것만 쓰면 자동으로 만들어지는 기능을 제공할 수 있도록 만들 수 있다. 클라이언트가 제어할 수 있는 부분이 적기때문에 캡슐화가 잘되어 있는 객체는 클라이언트에서 사용할 수 있는 api가 한정적이다. 또한 그 객체가 하는 기능이 매번 일관적인 기능을 제공할 수 있다.
또 하나의 장점은 오류에 대한 방어가 가능하다. 클라이언트 코드와 상관없이 서비스가 제공하는 객체쪽에서 오류의 디텍션이나 아니면 객체를 업그레이드만 해주면 되기 때문에 디버깅이나 기능을 추가하는데 유연하다.
package ch11;
public class MakeReport {
// StringBuffer() : 텍스트를 연결해주는 기능
// "" 안에 String 을 넣어주고 + 로 값을 넣어주는 방식은 메모리 오버헤드가 발생할 수 있기때문에
// StringBuffer() 와 StringBuilder() 를 사용해주면 append()를 활용해 스트링을 연결해줄 수 있다.
StringBuffer buffer = new StringBuffer();
private String line = "========================================\n";
private String title = " 이름\t 주소 \t\t 전화번호 \n ";
private void makeHeader() {
buffer.append(line);
buffer.append(title);
buffer.append(line);
}
private void generateBody() {
buffer.append("James \t");
buffer.append("Seoul Korea \t");
buffer.append("010-2222-3333 \n");
buffer.append("Tomas \t");
buffer.append("NewYork US \t");
buffer.append("010-7777-0987 \n");
}
private void makeFooter() {
buffer.append(line);
}
// private으로 만든 메서드들은 클라이언트쪽에 오픈해봤자 소용도 없고
// 다 오픈해놓아도 순서대로 사용해야하기 때문에
// 클라이언트쪽에는 밑에 메서드 하나만 제공해주면 된다.
// ------------------------------------------------------------------
//외부에서 사용할 수 있는 메서드는 이거 하나!
public String getReport() {
makeHeader();
generateBody();
makeFooter();
return buffer.toString();
}
}