본문 바로가기

JAVA/OOP

캡슐화와 정보은닉

반응형

캡슐화

클래스 혹은 객체라는 개념을 접할 때 가장 먼저 생각나게 하는 용어 가운데 바로 캡슐화


-캡슐화는 관련된 데이터와 함수를 묶는 장치이다.


관련된 데이터와 관련된 함수들을 클래스라는 하나의 캡슐 속으로 그룹화 혹은 묶어주는 장치 또는 매커니즘이다.

따라서 캡슐화를 다른 말로 표현할 때 번들링(bundling)이라고도 한다.

어떤 개념을 추상화시시켜 표현하는데 있어서 큰 도움이 된다.

추상화가 잘되면 될수록 프로그램의 모듈화를 향상시키는 결과가 된다.


기존 절차지향 언어에서도 이러한 캡슐화를 위한 시도로 C언어에서는 구조체나 공용체를 통해 사용하기도 하였다.

그러나 이 장치들은 관련된 데이터들을 묶어주는 장치에 불과했다.

이로 인해 특정 함수와 관련된 데이터들을 추적한다는 것이 매우 어려웠다.

이는 소프트웨어 유지보수의 비용에 대한 부담을 가져왔다.

객체지향 언어가 새롭게 등장하면서 이러한 캡슐화가 완벽하게 지원되었다.

즉 관련된 데이터와 함수들을 클래스라는 캡슐 속으로 묶어주는 장치가 등장하게 된 것이다.

이를 해결하기 위해서 객체지향 기술에서는 캡슐화라는 장치를 제안한 것이다.


캡슐화는 결국 클래스 혹은 객체라는 단위를 생성하는데 있어서 필수적인 요소이다.

정의된 클래스나 클래스로부터 생성된 객체 속에 서로 관련된 데이터나 함숟르을 묶여있지 않으면 이는 캡슐화가 제대로 반영되지 않을 것이라고 볼 수 있다.


예)

고객 클래스라는 캡슐속에는 데이터와 함수들이 묶여져있다.

이 고객이라는 캡슐속에 있는 데이터와 함수들을 보면 매우 밀접한 관련성을 지니고 있다.

각각의 함수들을 보면 같은 캡슐 내에 있는 데이터들을 접근하여 처리하는 함수들로 되어 있다.

이를 관련있는 데이터와 함수들의 집합이라고 한다.

여기서 말하는 관련성은 소프트웨어 공학적인 용어로 결합도가 높은 데이터와 함수들의 집합이라고 말한다.

한 캡슐 즉, 한클래스 내에 있는 데이터와 함수들은 매우 결합도가 높은 데이터와 함수들로 구성이 되어야만 한다.

따라서 클래스 정의에 대한 적정성을 판단하는 기준 가운데 하나가 캡슐화가 잘 되어있는지를 파악하는 것이다.


캡슐화의 특성

1. 추상화 단위가 된다.

- 추상화란 복잡한 문제를 다루기 위해서 불필요한 부분들을 숨기고 중요한 부분만을 표현하는 것을 의미.

- 캡슐화를 하면 추상화가 된다고 볼수 있다.

- 캡슐화는 관련된 데이터와 함수들을 하나의 캡슐 단위로 묶여주기 때문에 복잡한 내용들은 캡슐 내부 속으로 모두 숨어버리게 되고 외부에는 캡슐 단위의 의미 있는 단위로만 보여주기 때문에 추상화 단위가 된다.


2. 재사용의 단위가 된다.

- 객체지향에서 캡슐화의 단위는 클래스 단위로 정의하고, 클래스를 통해 객체 단위로 생성되어 움직인다.

- 객체지향 프로그램에서의 재사용의 단위는 클래스 혹은 객체 단위로 사용되기 때문에 데이터나 함수 단위로 재사용하는 것에 비해 훨씬 재사용성이 높아지게 된다.


3. 정보은닉을 실현하는 장치이다.

- 캡슐화를 통해 인터페이스를 제외한 데이터와 함수들을 캡슐 속으로 숨기기 때문에 캡슐화를 통해 정보은닉이 실현되게 된다.


캡슐화와 정보은닉

1. 캡슐화는 관련된 요소들을 묶음으로써 캡슐 내부와 외부를 구별 짓는 장치이다.

- 캡슐내의 속한 부분과 캡슐밖에 있는 부분들에 대한 명확한 구분이 이루어진다.

- 즉 특정 객체 속에 있는 데이터와 함수들이 다른 객체 속에 있는 데이터와 함수들과 구별이 이루어진다.

- 객체들 간에 서로 상대방 객체의 인터페이스(공용함수)만을 볼수 있다.

- 각 객체가 가지고 있는 데이터들은 해당 객체 속에 숨어 있기 때문에 외부 객체에서 볼 수 없다.


2. 정보은닉은 캡슐내의 요소들에 대한 세부 구현사항을 외부에 숨기는 장치이다.

- 정보은닉은 캡슐화 되어 있는 데이터와 함숟르에 대해서 외부에서 해당 함수가 어떻게 구현되어 있는지에 대한 세부 사항을 숨기는 것이다.

- 캡슐화가 되어 있다고 해서 반드시 정보은닉이 되는 것은 아니다.


UML에서의 캡슐화


Product

-productId:String

-price:int

+addProduct()

+deleteProduct()

-checkAmounts()


자바에서 캡슐화


public class Product {

private String productId;

private int price;


public void addProduct(String productId) {}

public Boolean deleteProduct(String productId) {}

private Boolean checkProduct(String productId) {}

}


Proudct 클래스로 추상화되었으며 Product 단위로 재사용 될수 있다.

또한 private 접근자에 의해 데이터와 함수에 대해 정보은닉을 구현할수 있다.


캡슐화되어 재사용될수 있는 클래스는 다른 클래스의 데이터로 재사용될수 있다.

이렇게 재사용되는 클래스는 추상화된 클래스 내부의 데이터나 함수를 모두 재사용 할수 있다.


public class Order {

String orderId;

Payment paymentType;

Product product;

}


정리

캡슐화란 관련된 데이터와 관련된 함수들을 클래스라는 하나의 캡슐 속으로 그룹화 혹은 묶어주는 장치 또는 매커니즘이다.

한 캡슐 즉, 한 클래스 내에 있는 데이터와 함수들은 매우 결합도가 높은 데이터와 함수들로 구성이 되어야만 한다.

클래스 정의에 대한 적정성을 판단하는 기준 가운데 하나가 캡슐화가 잘 되어 있는지를 파악하는 것이다.

캡슐화의 첫 번재 특징은 추상화 단위가 된다. 두번째 특징은 재사용의 단위가 된다. 세번째 특성은 정보은닉을 실현하는 장치가 된다.

캡슐화와 정보은닉의 차이점은 캡슐화는 관련 요소들을 묶어줌으로써, 캡슐 내부와 외부를 구별하는 장치이다. 반면에 정보은닉은 캡슐 내의 요소들에 대한 세부 구현 사항을 외부에 숨기는 장치이다.

UML에서의 캡슐화 표기는 클래스 설계시 묵시적으로 반영되어 설계된다. UML 클래스에 포함된 데이터 함수는 서로 밀접하게 관련되어 있다.

UML에서의 정보은닉 특성은 가시성를 통해 반영한다.

자바의 캡슐화 구현은 클래스 구현을 기반으로 추상화, 재사용 그리고 정보은닉을 구현한다.



정보은닉

캡슐화가 관련된 데이터와 함수를 묶어주는 장치에 반해 정보은닉은 캡슐속에 있는 데이터와 함수들 가운데 외부에 노출시키지 않고 내부에 숨기는 장치를 말한다.

- 정보은닉은 블랙박스이다.


정보은닉이 되기 위해서는 먼저 캡슐화가 되어 있어야 한다.

캡슐화가 되어 잇는 상태에서 객체 내부에 숨길 데이터와 함수들을 숨기는 것이 정보은닉이다.


유의할점

캡슐속에 있는 모든 데이터와 함수들을 다 은폐시켜 버리면 해당 객체는 외부 다른 객체들과 정보를 주고 받을 수 없다.

따라서 모든 데이터와 함수를 정보 은닉 시켜서는 안되고 외부에 노출시킬 필요가 없는 데이터와 함수들만 은폐시켜야한다.

그리고 외부 객체들과 정보를 주고 받을 수 있는 공개 인터페이스(public함수)를 반드시 하나 이상 정의해야 한다.


정보은닉은 공개인터페이스를 제공해야 한다.


공개인터페이스 = 객체라는 캡슐에 있는 함수들 가운데 일부

이 인터페이스 역할은 하는 함수들은 외부 객체와 정보를 주고받기 위한 통로 역할


공개 인터페이스는 해당 객체가 다른 객체들에게 자신이 어떠한 서비스를 제공할 수 있는 지를 선언하는 것이다.

이 공개 인터페이스에서는 해당 서비스를 제공하기 위해서 어덯게 구현되었는지에 대한 세부 사항은 전혀 노출되지 않는다.

따라서 공개 인터페이스에는 해당 함수명, 반호나타입, 매개변수 등만이 제공된다.


이 원리는 소프트웨어 공학에서 말하는 관심분리(Separate of Concern)원리를 반영하는 것이며, 하드웨어에서는 이러한 원칙이 많이 실현되어 개발되었다.

예) 마우스, 모니터 등

마우스의 내부 구현사항은 마우스 사용자들에게 모두 숨겨져 있고 다만 인터페이스인 버튼이나 휠만 공개 인터페이스로 제공되었다.

이러한 공개 인터페이스를 통해 해당 모니터와 마우스의 기능들을 사용하게 되며, 이 공개 인터페이스릍 통해 마우스 객체와 통신을 하게 되는 것이다.


정보은닉의 이점

정보은닉은 캡슐화를 함께 수반한다고 볼수 있다.

따라서 캡슐화의 특성이 정보은닉에도 반영된다고 할 수 있다.


1. 추상화를 향상시켜준다.

- 객체의 추상화 정도는 캡슐화와 정보은닉을 통해 이루어진다고 할 수 있다.

객체지향에서 모든 객체는 기본적으로 객체라는 캐슐 단위로 구성되기 떄문에 기존 절차지향 개념에 비해서는 추상화 정도가 많이 향상된것이다. 그러나 객체지향 자체에서 객체끼리의 추상화 정도를 비교할 경우에 있어서는 정보은닉의 정도에 따라 추상화 정도가 달라질 수 있다.

즉 정보은닉이 많이 되면 될수록 추상화 정도는 높아지게 된다.


2. 내부 데이터나 알고리즘의 변경이 용이하다.

- 기존 절차적 프로그래밍에서는 특정 데이터의 타입을 변경하는 경우에 있어서 해당 프로그램 내에 있는 모든 함수들 가운데 변경되는 데이터와 관련 함수들을 모두 추적해야 하는 어려움이 있었다.

그러나 객체지향에서는 정보은닉 장치가 지원되면 객체 내의 데이터나 함수를 변경할 경우, 타 객체에 영향을 주지 않고 독립적으로 변경을 쉽게 할 수 있다.


3. 모듈의 독립성을 높여준다.

- 모듈의 독립성은 해당 모듈이 다른 모듈과의 의존도를 가지고 판단한다.

즉, 해당 모듈에 대한 변경이 타 모듈에 끼치는 영향도를 가지고 측정하게 된다. 객체지향에서는 해당 객체 내에는 필요한 데이터와 함수들이 함께 존재하게 됨으로써(캡슐화) 모듈의 독립성이 존재할 뿐만 아니라 정보은닉을 통해 세부적인 데이터나 함수들을 은폐시킴으로써 모듈의 독립성(객체의 독립성)을 한 차원 더 향상시킨다.


4. 확장성을 높여준다.

- 정보은닉은 객체 단위로 이루어진다.

즉, 한 객체에 존재하는 데이터와 함수들에 대해서 정보은닉을 하게 된다.

따라서 일부 데이터나 함수들을 특정 객체 속으로 추가하거나 특정 객체 속에서 삭제할 경우, 타 객체들에 영향을 주지 않고 이루어질 수 있다. 따라서 객체 내의 데이터나 함수의 추가 및 삭제가 용이하기 때문에 정보은닉은 확장성을 높여준다.


UML

클래스 설계시 접근자를 통해 설계되며 접근자 '-'를 이용하여 데이터와 함수에 대한 정보은닉을 설계한다.



Customer

-name:String

-id:String

-password:String


+login()

-checkId()

+logout()

-checkRegistration()



public class Customer {

private String name;

private String id;

private String password;


public boolean login(String id, String pw) { return chekId(id, pw); }


private boolean checkId(String id, String pw) {

...

}

}



정리

캡슐화가 관련된 데이터와 함수를 묶어주는 장치에 반해 정보은닉은 캡슐 속에 있는 데이터와 함수를 가운데 외부에 노출시키지 않고 내부에 숨기는 장치를 말한다.

정보은닉은 데이터와 함수를 객체 내부에 숨기는 장치이다.

정보은닉은 블랙박스이다.

정보은닉은 외부 객체와의 통신을 위해 공개 인터페이스를 지닌다.

정보은닉을 이용하면 추상화를 향상시켜준다.

정보은닉을 이용하면 내부 데이터나 알고리즘의 변경이 용이하다.

정보은닉을 이용하면 모듈의 독립성을 높여준다.

정보은닉을 이용하면 호가장성을 높여준다.

UML에서의 정보인늑 표기는 클래스 설계시 접근자를 통해 설계되며 접근자 '-'를 이용하여 데이터와 함수에 대한 정보은닉을 설계한다.

자바의 정보은닉의 구현은 private, public, protected, friendly 접근자를 통해서 데이터와 함수 공개와 비공개를 구현한다.


출처-UML과 JAVA로 배우는 객체지향 설계 및 구현

반응형

'JAVA > OOP' 카테고리의 다른 글

상속  (0) 2018.04.17
복합객체  (0) 2018.04.17
메시지  (0) 2018.04.16
클래스와 객체  (0) 2018.04.13
소프트웨어 개발 패러다임과 객체지향  (0) 2018.04.13