객체 지향 프로그래밍 이전에도 개념적으로 존재해왔었지만 특별히 부각되는 부분이 정보은닉(혹은 캡슐화) 와 다형성 입니다.
이 항목은 그중에서 캡슐화에 대해 설명하고 있습니다.

객체지향 프로그래밍을 처음 접하는 사람들은 왜 클레스를 사용하며 public,protect,private 같은게 있는지, 도대체 그것을 씀으로 인해서 어떤 장점이 있는지 이해도 안될 뿐더러 불필요하게 느껴집니다. (아! 내가 그랬다)

하지만 캡슐화를 통해서 클래스 내부의 내용을 숨기고 겉으로 들어나는(public) 메소드를 추상화 시킴으로 인해서 나중에 기능의 추가/변경을 쉽게 할수 있게됩니다.

클레스는 '~를 하는 사람' 이라고 볼수도 있습니다.
만약 카페에서 카페모카를 마시고 싶다. 라고 한다면 점원에게 돈을주고 카페모카를 주문합니다. 하지만 우리는 그것을 만들기 위해 어떤 기계를 이용하고 어떤 재료가 들어가며 어떤 순서로 그것을 만들어내는지는 모릅니다. 물론 아는 사람도 있겠죠.
하지만 우리가 원하는것은 을 내면 카페모카를 나에게 주는것. 단지 그것 뿐입니다.

식당에가도 마찬가지입니다.(계속 먹는거만 나오네요) 짜장면이 먹고싶어서 중국집 가서 짜장면 곱배기 주세요. 라고 하면 짜장면 곱배기를 주고 돈을 받습니다. 우리는 그 짜장면의 춘장이 어떻게 만들어졌고 면은 어떤 밀가루로 만들었으며 어떻게 반죽하고 어떻게 면을 뽑는지도 모릅니다. 그저 돈과 짜장면의 교환만 되면 되는겁니다.

물론 고급 레스토랑에 가면 스테이크의 고기는 어떻게 굽고 어떤 셀러드를 어떻게 만들어서 자세하게 주문할수도 있습니다.

캡슐화 라는것도 이와 마찬가지입니다. 내부적으로는 어떻게 돌아가는지 사용자 입장에서는 큰 관심이 없습니다. 다만 원하는 요청에 필요한것을 집어넣고 재대로된 결과물을 내어 달라는겁니다.

그런데 그것과 접근성을 최소화 하는것이 무슨 관계냐?
만약 레스토랑에서 스테이크를 판다고 가정합시다. 이때 스테이크용 고기의 접근성을 public 로 해두었다고 합시다.
이 스테이크용 안심은 이제 아무나 접근 할수 있습니다. 지나가던 사람이 쑤셔볼지도 모르고 파리가 앉을지도 모릅니다. 혹은 지나가던 개가 먹어버릴지도 모릅니다.
이것이 접근성을 최소화 해야하는 이유입니다.

고기에 접근할수 있는것은 주방장 만 가능해야 합니다. 다시말해 스테이크를 만들어주는 사람 즉 스테이크를 만드는 클레스 입니다.

그러면 무조건 접근성을 private 로 해야할까요? 꼭 그렇지 않습니다. 우리는 요리를 구매하는 입장으로 주방이 청결한지. 좋은 재료를 사용하는지 알 권리가 있습니다. 그렇기에 필요에 따라서 public 메소드가 필요한것이고 최대한 접근성을 제한하되 적당한 공개는 필요하다는겁니다.


책에서는 몇가지 규칙을 제시하고 있습니다.
public 메소드를 신중하게 결정하고 나머지는 모조리 private로 해야한다.
특별히 패키지 내의 다른 클레스가 접근을 가능하게 하려 한다면 접근제한자를 제거한 패키지 전용 으로 변경 할수는 있다.
protected 도 쓰지말자. 이것도 범위가 너무 넓다.
테스트케이스를 제작하는 용도로 private맴버를 패키지전용으로 하는것은 허용된다.
인스턴스 필드는 절대로 public으로 해서는 안된다. - 다시말해 public은 메소드에만 붙이자.
하지만 인스턴스 필드가 final 이라면 public도 괜찬다.

이때 주의해야 할것은 List나 Set,Map 그리고 배열 같은 자료형은 final 이라도 public을 해서는 안된다.
그리고 getter 같은 형식을 통해 배열을 통째로 반환하는짓을 해서도 안된다.
위와 같은 자료구조의 경우에는 내용물을 뒤집는것은 쉬운일이기 때문이다.

만약 이런 기능을 지원하면서 자료구조를 유지하기 위해서는
Collections.unmodifiableCollection(collection)
List list=Collections.unmodifiableList(list);
Map map=Collections.unmodifiableMap(map);
Set set=Collections.unmodifiableSet(set);
SortedMap map=Collections.unmodifiableSortedMap(map);
SortedSet set=Collections.unmodifiableSortedSet(set);

를 이용해서 수정 할수 없는 자료구조를 만들거나
Object[] vlaues() {
	return objects.clone();
}

의 형식으로 구현해야한다.


하여튼 클레스의 내용물을 public 로 해둔다는것은 내 뱃속의 장기를 꺼내놓고 다닌다는 생각으로 조심해서 사용해야 할것이다.
Posted by 동적할당
: