Wikipedia에서는 Information Hiding을 아래와 같이 설명한다.

In computer science, the principle of information hiding is the hiding of design decisions in a computer program that are most likely to change, thus protecting other parts of the program from change if the design decision is changed. Protecting a design decision involves providing a stable interface which shields the remainder of the program from the implementation (the details that are most likely to change). In modern programming languages, the principle of information hiding manifests itself in a number of ways, including encapsulation (given the separation of concerns) and polymorphism.

정보 은닉(Information Hiding)은 컴퓨터 프로그램 내에서 변할 수 있는 설계 결정들(design decisions)을 숨기는 것으로, 설계 결정들이 변경되었을 때, 그 변화로부터 프로그램의 다른 부분들이 영향을 받지 않도록 하는 것이다. (역자 주> 이는 module 설계 시 이용되며 low-couping을 구현할 수 있다)

이러한 설계 결정을 보호하는 행위는, 구현들(변화 가능성이 있는 세부적인 내용들)로 부터 프로그램의 나머지 부분들을 숨겨주는 안정적인 인터페이스를 제공하는 것을 포함한다. 현대의 프로그래밍 언어에서는 캡슐화(encapsulation)와 다형성(polymorphism)을 포함하여 다양한 방법으로 정보 은닉의 원칙을 명시하고 있다.



cf) Information Hiding vs. Encapsulation

여기부터는 개인적인 의견이 대부분입니다. 편의상 한글과 영어 용어를 같이 사용합니다. (양해 바랍니다)
컴퓨터와 관련된 공부를 조금이라도 한 사람들이나, 객체지향 프로그래밍(Object-Oriented Programming)을 조금이라도 해 본 사람들에게 Information Hiding과 Encapsulation을 설명하라고 하면 다소 머뭇거리는 사람들이 있다. 이 글을 읽고나면 쉽게 설명할 수 있으리라 믿는다. (내가 잘못 알고 있지 않다면...)

Information Hiding은 위에서 설명한 것과 마찬가지로, 원칙(principle)이다. 즉, 개념적이고 논리적인 것이 바로 information hiding이며, 한 module내에서  변화할 수 있는 design decisions를 다른 부분들로부터 숨기는 원칙/원리를 의미한다.

Encapsulation은 information hiding을 구현(실제화)하는 것으로 생각할 수 있다. 위에 wikipedia에서 설명한 내용을 참고하면, 많은 프로그래밍 언어들(c++, java 등)이 information hiding을 위해서 다양한 방법들을 제공하는데, 그 중의 하나가 encapsulation이다. 하지만, encapsulatio은 적용 시에 관심분리(separation of concerns)가 선행되어야 한다. 이 말이 무슨말이냐 하면, interface처럼 외부에 보여질 것들과, module내로 숨길 정보들(design decisions, imlementation details)을 분리하여야 한다는 말이다.

즉, 두 용어가 사실은 같은 개념을 내포하고 있으며, 우리가 보는 관점이 다를 뿐이다. 원리/원칙의 관점과 그 것의 구현 관점이라는 측면에서...

Posted by nucl23
D.L. Parnas, CMU.
  이 페이퍼는 소프트웨어 개발 시간을 줄이면서 시스템의 유연성(flexibility)와 이해도(comprehensibility)를 향상시킬 수 있는 메커니즘으로 모듈화(modularization)에 대해서 논의한다.

  모듈화된 프로그래밍에서의 주요한 성과는 코딩 기술과 어셈블러의 개발로써 보여지고 있다. 그 성과에는 한 모듈을 작성할 때 다른 모듈에 대해 약간의 지식만을 가지고 작성이 가능하게 하는 것과, 전체 시스템을 재조립(reassembly)하지 않고 모듈들을 교체하거나 재조립이 가능하게 하는 것이다. 이러한 모듈화된 프로그래밍을 함으로써 얻을 수 있는 이득은 크게 3가지로써, 관리하기 쉽고, 제품의 유연성이 높아지고, 시스템의 이해도를 높일 수 있다. 여기서 말하는 모듈은 하위프로그램(sub-program)이라기 보다는 책임 할당(responsibility assignment)라 볼 수 있으며, 모듈화는 모듈에 대한 독립적인 작업 수행 이전에 행해져야 하는 디자인 결정들(design decisions)을 말한다.

 
이 논문에서는 예제로 KWIC Index Production System을 들고 있다. 크게 두 가지로 모듈화를 하였으며, 첫 번째는 Input, Circular Shift, Alphabetizing, Output, Master Control의 다섯 가지 모듈로 나누었고, 모듈에 대한 기능적인 설명과 모듈 사이에 주고받는 데이터 구조에 대해 설명하였다. 이 모듈들은 개발되기 이전에 인터페이스의 정의를 필요로 한다. 두 번째 모듈화는 유사하긴 하지만, 모듈의 정의에 모듈 외부로 보여줄 인터페이스를 정의하고 있다. 그 모듈들은 Line Storage, Input, Circular Shifter, Alphabetizer, Output, Master Control이 있다. 첫 째로, Line Storage에는 CHAR(r,w,c);r번째 줄 w번째 단어의 c번째 문자를 표현하는 정수 값, SETCHAR(r,w,c,d) CHAR(r,w,c) d로 표현되는 문자로 설정, WORDS(r) r번째 줄의 단어의 수를 리턴 등의 인터페이스와 그 기능을 정의하였다. 또 주요한 내용으로 Circular Shifter CSCHAR(l,w,c) l번째 circular shift w번째 단어의 c번째 문자를 리턴하며 파라미터에 대해서도 설명하고 있다. Alphabetizer ALPH, ITH(i);알파벳 순서로 i번째에 오는 circular shift index를 리턴 과 같은 인터페이스를 정의하고 있다.

 
첫 번째 모듈을 나누는데 있어서 기준은 processing하는 순서이며, 두 번째 모듈을 나누는 데 있어 기준으로 제시된 것은 자료 표현(data representation)의 정보를 숨김(information hiding)하는 것이다. 또한 information hiding외에도 세부적인 기준들(data structure, sequence of instructions, formats of control blocks, character codes, alphabetic orderings, sequence of certain items의 숨김)에 대해서 설명하고 있다. 두 번째 모듈화의 장점은 자료 표현을 다른 모듈로부터 숨기고 line storage에서 관리하며 인터페이스만 제공함으로 인해서, 이 시스템에서 변화 가능한 것들(Input형식, 라인 저장 방식, 단어를 4개씩 저장할 것인가 하는 결정, 간접 혹은 직접 정렬하여 circular shift를 저장할 것인지, 알파벳 순서로 리스트를 만드는 것을 on-demand로 할 것인지)에 따른 영향을 최소한으로 숨길 수 있다는 것이다. 그리고 시스템을 이해하는 데 있어 전체를 이해하지 않아도 되므로 이해도가 높아지고, 개발을 concurrent하게 할 수 있으므로 개발시간이 줄어들 수 있다. 이렇게 나눔으로 해서 실행시간에는 모듈간에 반복되는 스위칭으로 인해 효율이 떨어질 수 있지만, subroutine으로 맵핑해주는 다른 프로그램의 도움을 얻어 다소 극복할 수 있다. 이러한 information hiding외에도 계층 구조를 통해서 재사용성을 높일 수 있는 모듈의 구조를 만들 수 있다.(Dijkstra’s hierarchy)
Posted by nucl23

BLOG main image
Software Engineering, Reverse Engineering, Programming, Hobbies, etc. by nucl23

카테고리

분류 전체보기 (106)
Profile (1)
Diary (43)
Software Engineering (16)
Design Patterns (3)
Programming (7)
Compiler (4)
Eclipse (1)
Seminar (5)
Misc. (3)
Total : 16,953
Today : 3 Yesterday : 11