[C/C++] 캡슐화와 은닉화
객체 지향 프로그래밍에서 캡슐화란 관련된 정보를 틀안에 담는 것으로 객체의 기능중 일부를 그 객체로 부터 분리하여 다른 객체로 새롭게 구성하는 것이라고도 말할 수 있다. 객체 지향에 따르면 변하는 기능은 분리해 따로 캡슐화 한다.
객체는 자신의 인터페이스만을 통해 일을 수행한다. 다른 객체는 그 객체가 일을 어떻게 수행하는지에 대해서는 알 필요가 없고, 알지도 못한다.
위 코드에서 보면 변수들은 모두 접근제어자 private을 통해 객체를 통한 접근이 불가능하다.
단지 접근자( Set/Get 함수)를 통해서만 변수에 접근할 수 있다. nValue의 값은 x, y에 의해 결정되고 사용자가 임의로 변경할 수 없다. (접근할 수 있는 함수를 만들어 놓지 않았다.) 때문에 우리는 nValue의 값을 Sum이라는 함수를 통해 x, y의 합으로 받아들일 수 있으며 이는 명확히 x, y의 합이라는 것을 알 수 있다.
이렇게 캡슐화를 해두었기 때문에 객체의 값을 보장할 수 있다.
위 그림에서 물오리, 고무오리, 집오리는 오리를 상속받았고, 날기와 울기는 오리에 캡슐화 되어있다고 하자.
모든 오리가 날거나 울진 않기 때문에 날기와 울기를 사용하고 싶을 때는 인터페이스를 사용하면 된다. ( 이것이 Strategy 패턴의 간략화된 예이다. ) 이처럼 캡슐화는 감출 것은 감추고 사용법만을 알려줘서 편하고 쉽게 코드를 이용하거나 재사용할 수 있게 해준다.
은닉화는 캡슐화와 거의 비슷한 개념으로 은닉화를 지키기 위해 캡슐화가 쓰이고 있다.
객체의 외부로부터 객체의 내부에 대한 접근을 제한하고, 데이터를 수정하거나 조작하는 동작은 접근자(Get/Set 함수)를 통해 하는 것으로 이렇게 되면 외부에서는 내부적인 움직임을 알 수 없으며, 데이터에 어떤 값이 있는지 또는 어떤 변화가 일어나는지 알 수 없게 된다.
이러한 것을 은닉화라한다.
이 은닉화를 잘 지원하는 OOP의 요소가 인터페이스이다. 위에서 보았듯이 날기 인터페이스에 기능을 설계하고, 그 기능의 구현은 하위 클래스가 하게 한다. 사용자는 인터페이스에 명시된 기능의 용도만 알기 때문에 정보를 은닉시킬 수 있다.
캡슐화와 은닉화를 잘 활용하면 정보의 조작을 사전에 막을 수 있고, 객체들간 필요한 정보만 의존하기 때문에 결합도가 낮아져 연결이 보다 가벼워진다. 이 때문에 코드의 수정과 확장이 유연해진다.
여기서 은닉화와 캡슐화가 헷갈릴 것이다. 하지만 약간 다른 개념이니 차이를 알아두자.
은닉화란 private을 사용하여 주요 사항이 드러나지 않도록 감추는 것이고, 캡슐화란 중요사항을 감춘 상태에서 외부에서 그것을 사용할 수 있는 방법를 설정하고, 외부와 직접적인 소통을 하는 것이다.
.. 부족한 내용은 보강하쟈'-'