흔히들 캡슐화와 은닉화를 동일선 상에서 놓고 보는것 같다. 꼭 그런것은 아니지만, 몇군데 검색해서 찾아보면 캡슐화와 은닉화를 같다고 이야기 하는 경우를 종종 볼 수 있다. 내가 좋아하는 책인 O'Reilly의 Headfirst Java책에도 캡슐화를 데이터 은닉과 같게 취급하고 있다.
물론, 캡슐화나 은닉화로서 나온 결과물이 비슷하다는 점에서 그 둘을 같다고 볼 수 있겠지만, 개인적인 생각으로는 캡슐화와 은닉화의 개념을 좀 구분지어야 하지 않을까 싶다. 결론부터 얘기하자면
"캡슐안에 데이터를 숨긴다"
정도가 되겠다.
여기에는, 캡슐이 있고 데이터가 있다. 캡슐과 데이터는 엄연히 다른것이다. 데이터는 프로그래밍에서 변수로 쉽게 취급될 수 있지만, 캡슐이 메소드 단위를 의미하는지, 클래스 단위를 의미하는지, 아니면 프로젝트 단위를 의미할 것인지는 불분명 하다. 요는 캡슐화가 데이터은닉에 비해 훨씬 추상적인 개념이라는 것이다.
데이터 은닉을 표현하는것은 쉽다. 만약 자동차의 좌석수를 설정한다고 해보자. 자동차라는 클래스가 있고, 어딘가 다른 클래스에서 그 자동차의 좌석수를 아래와 같이 설정한다고 하자.
---------------------------------------------------------------------------
Car myCar = new Car();
myCar.numberOfSeat = 3; // numberOfSeat 는 Car의 변수
---------------------------------------------------------------------------
Car내부의 numberOfSeat라는 변수를 직접 접근해서 값을 설정하고 있다. 하지만 자동차의 좌석수는 적어도 1개보다 많아야 한다. 만약 아래와 같이 설정한다면 어떻게 될것인가..
---------------------------------------------------------------------------
Car myCar = new Car();
myCar.numberOfSeat = 0; // numberOfSeat 는 Car의 변수
---------------------------------------------------------------------------
어처구니 없지 않은가.. 자동차의 좌석수가 0이라니.. 이순간 우리는 좌석이 하나도 없는 자동차를 갖게 되는 것이다. 이런일은 있을 수 없으며 또, 이런일이 발생하지 않도록 좌석의 수가 1보다 클수있도록 제제를 가할 방법이 필요하다. 어떻게 하면 되겠는가?
1. 먼저 데이터를 곧바로 접근해서 맘대로 값을 할당할 수 없도록 해야한다 :
Car내부의 numberOfSeat변수의 접근자를 public 에서 private로 변경해 주면 된다.
---------------------------------------------------------------------------
// Car 내부...
public int numberOfSeat -> private int numberOfSeat
---------------------------------------------------------------------------
이제 외부의 어떤 클래스도 Car내부의 numberOfSeat을 함부로 건드릴 수 없게 되었다.
2. 값을 설정하거나, 불러올때 : getter와 setter를 사용하면 된다.
---------------------------------------------------------------------------
// Car 내부...
public void setNumberOfSeat(int n)(){
if(n>=1) numberOfSeat = n; // 만약 1보다 크거나같다면
} // 내부변수에 값 할당
public int getNumberOfSeat()(){
return numberOfSeat; // 내부변수값 보내주기
}
---------------------------------------------------------------------------
3. 마지막으로, 외부의 클래스에서 아래와 같이 사용하면 된다
1) 값을 대입할경우 : myCar.setNumberOfSeat(4)
2) 값을 받아올경우 : myCar.getNumberOfSeat()
만약 값을 대입할때, myCar.setNumberOfSeat(0)을 한다면 어떻게 될까.. 당연히 컴파일 에러가 발생할 것이다. 즉, 앞으로는 1보다 작은값이 절대 들어갈 수 없게 되는 것이다. 이로서 데이터의 무결성 또한 보장된다.
은닉은 밖으로 들어나지 말아야 하는것을 철저하게 감추는 것을 의미 한다. 따라서 클래스 내부적으로만 사용해야 하는 메소드들도 모두 private로 설정해야 함을 잊지 말아야 할 것이다.
'My work space > Java' 카테고리의 다른 글
has-a 집합연관(aggregation) (0) | 2008.08.14 |
---|---|
캡슐화,은닉화(Encapsulation)-2 (0) | 2008.08.14 |
개발자가 놓치기 쉬운 자바의 기본원리 (0) | 2008.08.14 |
아스키 코드표 (0) | 2008.08.14 |
JAVA SDK API 1.5 한글번역문서 (0) | 2008.08.14 |