캡슐화(Encapsulation)는 객체지향 시스템에서 자료 부분과 연산 또는 함수 부분처럼 정보처리에 필요한 기능을 한 테두리 안에 묶는 것이다. 데이터와 그 데이터를 다루는 기능을 하나의 단위로 감싸고 외부에서 내부를 직접 건드리지 못하게 보호한다. 이름 그대로 알약 캡슐에 성분을 감싸 넣는 모습을 떠올리면 된다.
캡슐화는 정보은폐와 가장 밀접하게 이어진다. 정보은폐는 객체 내부의 데이터나 처리 로직을 외부에서 직접 보거나 건드리지 못하도록 숨기는 설계 원칙이고, 캡슐화가 이 원칙을 프로그래밍으로 실현하는 구체적인 기법이다. 원칙을 '왜'라고 하면 캡슐화는 '어떻게'에 해당한다. 비슷한 보기들과의 구분도 중요하다. 클래스는 캡슐화가 이루어지는 설계도이자 단위일 뿐이고, 메시지는 객체 사이의 통신 수단이며, 상속성은 코드 재사용을 위한 개념이라 정보은폐와 직접 대응되지 않는다.
캡슐화의 장점을 거꾸로 묻는 문제가 단골이다. 캡슐화는 정보 은닉과 모듈화를 통해 재사용성을 높이므로, '재사용이 불가능하다'는 설명은 명백한 오답이다. 내부 구현이 숨겨져 있으면 내부 코드가 바뀌어도 외부에 노출된 부분이 같다면 다른 곳에 영향을 주지 않아 변경이 쉽고, 결합도가 낮아지며, 객체 사이의 상호작용이 노출된 접점을 통해서만 일어나 인터페이스가 단순해진다. 다만 캡슐화가 소프트웨어의 분석 단계를 간단하게 만들지는 않는다. 객체와 책임을 정확히 나누는 작업은 오히려 더 정교한 분석·설계를 요구하므로, '분석 단계를 단순화한다'는 보기는 장점이 아니다.
예제
자동차를 운전한다고 하자. 운전자는 핸들과 페달이라는 접점만으로 차를 다룬다. 엔진 내부가 어떻게 돌아가는지 몰라도 되고, 함부로 내부를 만질 수도 없다. 캡슐화된 객체가 이와 같아서, 겉으로 드러난 조작 방법만 쓰고 내부 데이터와 처리 과정은 숨겨 둔다.
회사에서 쓰던 계산 모듈을 다른 프로그램에 다시 쓴다고 하자. 모듈 내부가 캡슐화되어 있으면 겉으로 약속된 사용법만 그대로 지키면 되므로 코드를 처음부터 짜지 않아도 된다. 내부를 고쳐야 할 일이 생겨도 겉모습이 바뀌지 않으면 다른 프로그램들은 영향을 받지 않는다. 이것이 캡슐화가 재사용성을 높인다는 말의 실제 모습이다.
대표 기출 3문항
객체 지향의 기본 원리인 정보은폐와 가장 밀접한 관계가 있는 것은?
캡슐화(encapsulation)
클래스(class)
메시지(message)
상속성(inheritance)
정답과 해설 보기
정답 ① · 객체 지향의 정보은폐 원리와 가장 밀접한 개념을 고르는 문제이다. 정보은폐는 모듈이나 객체의 내부 구현 세부사항을 외부로부터 감추고 필요한 인터페이스만 노출하는 설계 원칙이다.
정보은폐는 내부 구현을 숨기고 외부와의 상호작용만 노출하는 것으로, 이를 구현하는 핵심 기법이 캡슐화이다.
캡슐화(Encapsulation)의 장점이라고 볼 수 없는 것은?
소프트웨어 변경시 파급효과를 최소화 한다.
소프트웨어의 분석단계가 간단해진다.
소프트웨어 컴포넌트(Component)의 재사용을 쉽게 한다
캡슐화된 객체 간에 인터페이스가 단순화 된다.
정답과 해설 보기
정답 ② · 캡슐화의 장점이 아닌 것을 고르는 문제이다. 캡슐화는 객체의 내부 자료와 연산을 하나로 묶고 내부 구현을 정보 은닉하여 외부와의 결합도를 낮추는 객체지향 개념이다.
캡슐화는 내부 구현을 감추어 복잡도를 낮추지만, 분석 단계 자체를 단순화시키지는 않으므로 ②가 옳지 않다.
객체지향 시스템에서 자료부분과 연산(또는 함수)부분 등 정보처리에 필요한 기능을 한 테두리에 묶는 것을 무엇이라고 하는가?
Information hiding
Class
Integration
Encapsulation
정답과 해설 보기
정답 ④ · 객체지향에서 자료와 연산을 하나로 묶는 개념을 묻는 문제이다. 캡슐화(Encapsulation)는 객체의 자료부분과 그 자료를 처리하는 연산(메서드)을 하나의 단위로 묶고 외부의 직접 접근을 제한하는 개념이다.
객체지향 프로그래밍에서 데이터(자료)와 메서드(연산)를 하나의 단위로 묶어 외부로부터 보호하는 개념은 캡슐화(Encapsulation)이다.