ohjongsung's Dev Story

Ohjongsung's Dev Story

정보은닉 Information hiding

2021년 02월 21일

인터넷에서 정보은닉에 대해 검색하면 private 접근 제어자를 사용해서 내부 데이터에 대한 접근을 막고 getter / setter 를 사용해서 접근하는 것으로 설명하고 있다. 이는 데이터 캡슐화로 엄밀히 말해서 정보은닉이라고 할 수 없다.

객체지향 언어의 장점이라고 하면 생산성, 재사용성, 유지보수 용이성이라고 한다. 이 장점들의 공통점이 뭘까? 빠르게 변화해가는 서비스 구조에 유연하게 대처할 수 있게 해준다는 점이다. 객체지향 언어는 유연성을 갖고 있는데, 이를 가능케 하는 것은 정보은닉이다.

모듈은 두 가지 비밀을 감추어야 한다.

  • 첫 번째는 복잡성이다. 모듈이 너무 복잡하면 이해하고 사용하기가 어렵다. 그래서 인터페이스를 제공해서 모듈의 복잡도를 낮춘다. 외부에서는 인터페이스만 파악하고 사용하면 된다. 최대한 외부에서 알아야 할 정보를 줄이자.

  • 두 번째는 변경 가능성이다. 변경 될 부분이 외부에서 이미 사용되고 있다면 파급 효과가 커진다. 그래서 외부에는 쉽게 변경되지 않을 인터페이스만 제공하고 모든 변경은 모듈 내부에서만 일어나게 한다. 최대한 외부에 호출(사용)되는 부분을 줄이자.

위의 두 가지 비밀을 감추는 것이 정보은닉이다. 정보은닉은 모듈을 설계하고 분할하기 위한 기본 원리로써 변경에 대한 유연성을 제공한다. 정보 은닉의 원리에 따라 설계된 서비스는 변경에 대한 파급효과 범위가 작아서 변경에 대한 비용이 적다. 그리고 적절히 모듈화 된 코드는 분석하기 위한 코드의 양이 적기 때문에 파악하고 사용하기 쉽다. 또한 개발자들이 다수의 업무를 동시에 진행할 수 있게 일을 나눌 때, 서로 알아야 하는 정보의 양(회의 시간)을 줄이면서 독립적으로 작업을 진행 할 수 있게 한다. 쉽게 말해서 상대쪽에서 제공해준 인터페이스 구조만 파악하고 사용하면 어떻게든 원하는 데이터를 넘겨준다고 믿고 내 작업만 하는거다.

정보은닉의 개념을 이해하고 나면 객체지향 설계(SOLID) 도 이해하기 쉬워진다. 간단히 정리해보면,

  • 단일 책임 원칙 (Single Responsiblity Principle) : 모든 클래스는 각각 하나의 책임만 가져야 한다. 여러 책임을 가지면, 외부에서 이 클래스가 어떤 일하는지 파악해야 하는 정보도 많아지고, 사용(노출)되는 목적도 다양해 진다. 그러면 유연성이 떨어진다.

  • 개방-폐쇄 원칙 (Open Closed Principle) : 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 열려있고, 변경에는 닫혀있어야 한다. 변경에 대한 파급효과 범위가 크면 유연성이 떨어진다. 최대한 변경 가능성이 큰 부분은 내부로 감추고 외부에서는 변경에 대해 모르게 한다.

  • 리스코프 치환 원칙 (Liskov Substitution Principle) : 서브 타입은 언제나 기반 타입으로 교체(호환)될 수 있어야 한다. 외부에서 구현 클래스를 사용하고 있으면, 유연하게 클래스 교체를 할 수가 없다. 인터페이스(상위 클래스)에 의존하게 해서 외부에서는 교체 사실도 모르게 하자.

  • 인터페이스 분리 원칙 (Interface Segregation Principle) : 한 클래스는 자신이 사용하지않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다. 인터페이스도 여러 책임을 가지면, 외부에 불필요하게 노출되는 정보가 많아진다. 굳이 파악할 필요도 없는 정보까지 분석해야 한다. 인터페이스도 최대한 쪼개자.

  • 의존 역전 원칙 (Dependency Inversion Principle) : 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다. 서비스가 변해서 다른 구체적인 클래스가 필요할 때 변경에 대한 파급 효과가 크다. 추상 클래스나 인터페이스에 의존해서 쉽게 변경이 가능해야 한다.

정리하면, 객체지향 설계(SOLID)도 결국은 외부에 노출되는 정보를 줄여서 복잡성(파악이 필요한 범위)를 줄이고, 변경에 대한 파급 효과 범위를 줄이는 것이다. 그러니까 객체지향 설계 5원칙을 추상화하면 정보 은닉의 기본 원리가 된다.

골치아프게 설계 5원칙을 따져보는 것보다 정보은닉의 두 가지 원리만 생각하면 자연스레 설계 5 원칙도 지켜갈 수 있다. 적어도 나는 그렇게 생각한다.

Reference