캡슐화와 데이터 은닉

객체 사용에 해당되지 않는 세부 정보는 다른 모든 객체로부터 숨겨야 한다.
캡슐화는 객체에 속성과 행위가 같이 포함된다는 사실로 정의된다. 데이터 은닉은 캡슐화의 중요한 일부이다.

예를들어, 어떤 숫자의 제곱을 계산하는 객체가 결과를 얻기 위한 인터페이스를 제공해야 한다고 하자. 그러나 요청하는 객체에서 제곱을 계산하기 위해 사용하는 내부 속성 및 알고리즘을 사용하게 할 필요는 없다. 캡슐화를 염두에 두고 설계해야 클래스가 견고하다.

인터페이스

인터페이스는 객체간 의사소통하는 근본적인 방법을 정의한다. 클래스를 설계할 때마다 객체를 올바른 인스턴스로 만들고 운영하기 위하여 인터페이스를 지정한다. 객체가 제공하는 행위는 전송된 메시지가 제공된 인터페이스 중 하나를 사용하여 호출해야만 한다. 인터페이스는 클래스 사용자가 어떻게 클래스와 상호작용하는지 모두 설명해야 한다. 대부분의 OO 언어에서 인터페이스의 일부인 메소드는 공개(public)로 지정된다.

  • 비공개 데이터
    데이터 은닉이 효과를 발위하려면 모든 속성을 비공개(private)로 선언해야한다. 그래서 속성은 결코 인터페이스의 일부가 될 수 없다. 공개 메소드만 클래스 인터페이스의 일부이다. 속성을 공개(public)로 선언하는 것은 데이터 은닉의 개념을 위반하는 것이다.

방금 언급한 숫자의 제곱을 계산하는 예를 살펴보다. 이 예에서 인터페이스는 두 부분으로 구성된다.

1. Square 객체를 인스턴스로 만드는 방법
2. 객체에 값을 보내고 그 값의 제곱을 되돌려 받는 방법

이 장의 앞부분에서 논의한 대로 사용자가 속성을 액세스해야 할 경우 속성의 값을 반환하도록 메소드를 생성한다 (getter). 사용자가 속성의 값을 얻기 원하면 메소드를 호출하여 그 값을 반환한다. 이런 방법으로 속성을 포함한 객체는 속성에 대한 액세스를 제어한다. 이것은 아주 중요하며 보안, 테스트, 유지관리에 있어 특히 그렇다. 속성에 대한 엑세스를 제어하면 한 곳에서만(setter) 속성을 변결 할 수 있기 때문에 문제가 발생 할 때 속성을 변경할 수 있는 코드의 모든 부분을 점검하느라 수고하지 않아도 된다.

구현

공개 속성과 메소드만 인터페이스로 간주한다. 사용자는 구현의 어떤 부분도 볼 수 없어야 하며, 객체와의 상호작용은 클래스 인터페이스를 통해서만 이루어진다. 대부분의 경우 감추어져서 인터페이스의 일부가 되지 않아야 하는 메소드가 있다. 이전 단락의 제곱근의 예를 더 살펴보면 사용자는 정답이기만 하면 제곱근을 어떻게 계산했는지 상관하지 않는다. 그래서 구현을 변결할 수 있으며 사용자 코드에 영향을 주지 않는다. 예를 들어 계산기를 생산하는 회사는 결과에 영향을 주지 않고 알고리즘을 변경할 수 있다 (분명 더 효과적이기 때문일 것이다).

인터페이스/구현 패러다임의 실제 예

그림은 코드 보다는 실제 객체를 사용하여 인터페이스/구현의 예를 보여준다. 토스터는 전기를 필요로 한다. 전기를 얻기 위해 토스터의 코드를 인터페이스인 전기 콘센트에 꼽아야 한다. 토스터가 전기를 얻기 위해 해야 할 일은 전기 콘센트 규격에 맞는 코드를 사용하는 것이다. 이것이 토스터와 전력 공급 회사 간의 인터페이스다.

인터페이스/구현 패러다임의 모델

public class IntSquare {
    private int squareValue;
    public int getSquare (int value) {
        squareValue = calculateSquare(value);
        return squareValue;
    }
    private int calculateSquare (int value) {
    return value*value;
    }
}

객체는 사용자가 상호작용해야 할 필요가 있는 인터페이스만 드러내고 객체 사용에 해당하지 않는 세부 사항은 다른 객체로부터 숨겨진다.
구현을 변경해야 할 경우 다시 말해 제곱 함수의 '언어'를 변경하려면 인터페이스를 변경할 필요가 없다. 사용자는 동일한 기능을 얻지만 구현은 변경되었을 수 있다. 이 점은 데이터를 다루는 코드를 작성할 때 아주 중요한데, 예를 들어 사용자가 응용 프로그램 코드를 변경하도록 강제하지 않고서도 파일의 데이터를 데이터베이스로 옮길 수 있다.

Comments