해당 페이지에서 정리할 내용은 캡슐화와 추상화, 은닉화가 무엇인지 정확히 개념을 잡고 무슨 차이점이 존재하고 구분하는 법을 생각해 보기 위한 내용을 정리하려고 합니다.
본인은 해당 개념에 대한 정의는 알고 있지만, 차이점을 정확히 모르겠고 어떻게 구분해야 될 지 모르겠어서 정리해보고자 합니다.
즉, 해당 페이지에서의 중점적인 목표는 캡슐화, 추상화, 은닉화의 차이입니다.
캡슐화, 추상화의 경우 객체 지향 프로그래밍의 4가지 특성에 포함되어 있는 개념입니다.
⚡ 객체 지향 프로그래밍의 4가지 특성 ⚡
- 추상화: 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지/보수를 용이하게 하는 것
- 상속성: 이미 작성된 클래스를 이어 받아서 새로운 클래스를 생성하는 기법(재활용)
- 다형성: 하나의 이름(방법)으로 많은 상황에 대처하는 기법(상속 + 가상메서드)
- 캡슐화: 관련된 데이터와 알고리즘(코드)를 하나의 묶음으로 정리한 것
먼저, 캡슐화랑 추상화를 살펴보기로 합시다.
그 이후 캡슐화랑 은닉화를 살펴볼 것이다.
캡슐화는 객체 지향 프로그래밍에서 다음 2가지 측면이 있습니다.
특징을 살펴보자.
- 캡슐화는 내부 구현에 대해 유연함을 제공해 주는 기법이다.
- 객체가 내부적으로 기능을 어떻게 구현했는지 감추는 것
- 변경 가능성이 높은 부분은 내부에 숨기고 외부에는 상대적으로 안정적인 부분만 공개함으로써 변경의 여파를 통제한다.
- 변경될 가능성이 높은 부분을
구현
이라고 하고 상대적으로 안정적인 부분을인터페이스
라고 합니다.외부에 영향을 주지 않고 객체 내부의 구현을 변경할 수 있게 한다.
캡슐화의 가장 큰 장점은 정보 은닉(Information Hiding)이라고 생각하면 됩니다.
그렇다면 정보 은닉의 장점은 무엇일까요?
자세한 내용은 은닉화를 설명하는 부분에서 보겠지만, 간단하게 말하자면 직접적으로 데이터에 접근하지 못한다는 점과 조작의 유용함을 생각하면 됩니다.
캡슐화를 하기 위해서 Java의 경우 접근 제어자를 활용합니다.
⚡ 접근 제어자 ⚡
클래스 접근 제어자
- dafault: 동일 패키지의 클래스(class)에만 인스턴스(객체)를 생성 가능하다.
- public: 다른 패키지에서 인스턴스(객체)를 생성 가능하다.
메소드 접근 제어자
- private: 동일한 클래스 안에서만 접근이 가능하고, this를 사용하는 것들은 외부에서 접근 불가능하고, 상속도 안된다.
- default: 접근제어나가 없는 형태로 동일한 패키지 안에서만 접근이 가능하다.
- protected: 동일한 패키지 안에서 사용 가능하고, 다른 패키지라도 상속받은 클래스에는 접근이 가능하다.
- public: 모든 객체에서 접근 가능하다.
일반적으로 사용하는 메소드로는 setter, getter를 생각해 볼 수 있겠군요.
결국 캡슐화란 쉽게 말하면 변수나 메소드들을 캡슐로 감싸서 안보이게 하는 정보 은닉 개념 중 하나인 것입니다.
❗ 추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다. (컴퓨터 과학 관점)
좀 더 풀어서 말하자면, 데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정이라고 생각하면 됩니다.
객체 지향 관점에서의 추상화를 살펴봅시다.
추상화는 구현 세부사항 대신 기능 측면에서 클래스를 개발하는 것입니다.
이렇게만 보면 이해하기가 좀 어렵습니다.
일단 추상화를 정확하게 이해하기 위해선 JAVA에서 사용하는 슈퍼 클래스 혹은 인터페이스를 알고 있어야 합니다.
❗ 해당 클래스는 불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화 하는 것입니다. 즉, 모델화 하는 것으로 데이터의 공통된 성질을 추출하는 것입니다.
예를 들어서 생각해 봅시다.
printf()의 경우 우리는 이 함수가 무엇을 하는지 알고 있습니다.
하지만, 내부적으로 이 함수가 무엇을 하는지는 모릅니다.
또한 해당 함수를 확인해보면 함수를 구현할 때 함수 내 블록화된 코드를 묶어서 함수로 만들었습니다.
이러한 방식이 추상화라고 생각하면 됩니다.
- 생산성 증가
- 가독성 증가
- 에러 감소
- 유지 보수시 시간 단축
잘 만들어진 슈퍼 클래스는 코드의 재사용성이 증가하여 이러한 특징을 가져옵니다.
캡슐화와 추상화는 개발에 도움을 주는 객체 지향의 두 가지 특성인 것이다.
캡슐화는 기능 구현을 외부로부터 감추고, 내부의 구현 변경이 외부로 전파 되는 것을 막아준다.
추상화는 추상화를 한 클래스가 있고, 그것을 참조 하거나 확장하는 클래스가 여러 개 필요할 경우 또, 그 클래스들이 가지고 있는 데이터는 서로의 데이터에 영향을 주지 않습니다.
👉 결국 둘은 상호 보완적인 개념입니다.
❗ 정보 은닉을 구체적으로 말하면, 객체 지향 언어적 요소를 활용하여 객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법을 칭합니다.
보통 처음에 객체 지향 파트에 들어서면 대게 캡슐화 == 정보 은닉으로 암기를 합니다. 이것은 틀린 소리는 아니지만 정보 은닉 개념에 일부분밖에 보지 못하는 것입니다.
좀더 자세히 들어가자면, 자바 프로그래밍의 정보 은닉 기법은 대표적으로 3가지 정도가 있습니다.
즉, 캡슐화 == 정보은닉이 아니라, 정보 은닉 기법 중 하나가 캡슐화 라는 것입니다.
이밖에도 업 캐스팅과 인터페이스 구현 역시 정보 은닉 측면에 포함 되는 것입니다.
부모 클래스 타입으로 통합을 하거나 인터페이스 타입을 사용하는 것은 역시 구체적인 클래스 타입을 은닉 함으로서 보다 더 다양하게 사용할 수 있기 때문이다.
- 보안적인 측면에서 도움을 준다.
- 세세한 부분들을 은닉하여 코드를 보기 쉽게 만들어 줍니다.
- 예를 들어, 자동차를 몰 때 엔진이 어떻게 구동 되어 바퀴가 굴러가는지 알 필요가 없는 것과 마찬가지 이다.
자세한 부분은 다루지 않고 이정도에서 마무리 하겠습니다.
정보 은닉은 정보 은닉만 따로 다룰 예정입니다.
결국 은닉화의 종류중 하나가 캡슐화였던 것이고, 추상화는 캡슐화와 같이 객체 지향 프로그래밍의 특징으로 서로 상호 보완적인 개념이라고 보면 됩니다.
Reference