2008. 8. 14. 16:13

캡슐화,은닉화(Encapsulation)-2

아마 여러분은 굳이 텔레비전의 내부를 뜯어보지 않아도 리모콘을 통해 텔레비전을 사용할 수 있을 것입니다. 또는 자동차가 어떻게 작동하는 지 알지 못해도 운전하는 방법만 알고 있다면 자동차를 운전할 수 있을 것입니다. 설사 여러분이 운전을 할 수 있다고 하더라도 실제로 자동차의 엔진 내부를 뜯어본 사람은 별로 없을 것입니다. 엔진은 자동차에게서 가장 중요한 부품이 아닙니까? 오히려 엔진 내부를 뜯어봤다면 아마도 그 자동차는 제대로 작동하지 않을 지도 모르죠. 자동차 정비소에서 엔진을 한번 볼 기회가 있었는데 캡슐같이 생긴 통안에 머리카락이라도 보일까봐서 아주 깊숙히 꼭꼭 숨어있더라고요. 이렇게 꼭꼭 숨어있다고 하더라도, 그것이 엔진이 어떻게 작동되는 지 세부적인 사항을 알지 못하더라도 우리는 이 엔진을 손쉽게 작동시킬 수 있습니다. 자동차가 제공하는 엑셀레이터를 통해서 말이죠. 이것이 객체지향 방법론에서 말하는 캡슐화라고 하는 것입니다.말 그대로 중요하고 세부적인 구현 방법에 대한 자세한 사항은 캡슐 안에 꼭꼭 숨겨놓는 것입니다. 자동차에게 중요한 것이 엔진이라면 소프트웨어 시스템에게 있어서 중요한 것은 데이터입니다. 그래서 캡슐화를 데이터 감추기(data hiding)라고도 하는 것이지요.

----------------------------------------------------------------------------------------

여기서 주의깊게 살펴봐야 하는 부분을 색으로 표시하였다. 우리가 엔진이 어떻게 작동하는지 알지 못해도 엑셀레이터를 이용해 자동차를 움직이게 할 수 있는것처럼 메소드나 클래스의 내부가 어떻게 동작하는지 알 지 못해도, 그 클래스에서 사용하는 기능을 이용하여 문제를 해결할 수 있다.

아래의 예를 보자

     Math.round(12.5);

위의 코드는 12.5를 반올림해서 결과값을 반환해준다. 우리는 Math라는 클래스가 어떻게 생겼는지, 어떻게해서 round 메소드에서 반올림이 이루어지는지 전혀 알지 못한다. 단지, Math.round()의 괄호안에 숫자를 집어넣으면 반올림이 된다는 사실만 알고있고, 그것을 이용할 뿐이다.

 

이전 포스트에서 자동차의 좌석수를 지정하고 이용하기 위해서 setter와 getter메소드를 이용하였다. 이때, 사용자는 어떻게 데이터가 setting되고, 어떻게 데이터가 반환되는지에 신경쓸 필요가 없이 setter와 getter가 어떤역할을 하는지만 안다면, 이전 포스트처럼 값을 대입해서 이용하기만 하면 된다. 이처럼 실제로 구현되는 부분을 외부에 드러나지 않도록 캡슐로 감싸 이용방법만을 알려주는것이 캡슐화의 중요 컨셉이다.

그리고, 이 캡슐화 과정에서 데이터들과, 여러 로직들이 은닉된다. 캡슐로 감싸 숨기는 것이다.

 

내가 생각하는 캡슐화와 은닉화의 차이점을 정리하자면 은닉화는 중요사항이(변수던 메소드던간에)밖으로 드러나지 않도록 꼭꼭 감추는것을 의미한다면, 캡슐화는 중요사항을 감춘 상태에서 외부에 그것을 사용할 수 있는 방법을 설정하고, 외부와 직접적으로 의사소통을 의미 한다는 점이 차이점이 될 것이다.

 

아래의 예는 Headfirst Design Patterns중 Strategy Pattern예제이다.

 

사진을 클릭하면 원본 크기의 사진을 볼 수 있다.

 

위의 예에서 오리에게는 날거나 꽥꽥거리거나 하는행동이 필요하다. 이때, 날거나 꽥꽥거리는 행동을 각 오리마다 따로 코딩한다는것은 코드의 유지보수면에서 대단히 안좋다. 이런때, 날거나 꽥꽥거리는 행동을 각각 캡슐화 해서 날고 싶을때는 위쪽 사각형의 나는 행동의 캡슐화 해좋은 부분에 메소드를 사용하고, 꽥꽥 거리고 싶을때는 꽥꽥 거리는 행동을 캡슐화 해놓은 메소드를 사용하면 된다. 이때 나는것은 fly()메소드를 이용하고, 꽥꽥거리는것은 quack()메소드를 이용한다.

이처럼 캡슐화는 감출것은 감추고 사용법만 알려주어, 편하고 쉽게 코드를 이용또는 재사용 할 수 있게 해준다.

 

** 위 uml의 예제코드는 생략한다.

출처 http://blog.naver.com/echris7/140022757952

'My work space > Java' 카테고리의 다른 글

use-a 복합연관(composition)  (0) 2008.08.14
has-a 집합연관(aggregation)  (0) 2008.08.14
캡슐화,은닉화(Encapsulation)-1  (0) 2008.08.14
개발자가 놓치기 쉬운 자바의 기본원리  (0) 2008.08.14
아스키 코드표  (0) 2008.08.14