이 글은 조영호 님의 저서 "오브젝트 Objects"를 읽고 정리한 글입니다.
🐳 객체 지향이란 무엇일까 ?
객체지향 프로그래밍하면 떠오르는 것이 무엇인가요 ?
저는 생각해 보면 추상화,상속,다형성,캡슐화 등등의 키워드가 생각납니다.
그리고 객체 지향 패러다임으로 프로그래밍을 진행한다고 가정해 봅시다.
책의 예시는 영화 예매 프로그래밍을 예시로 들고 있습니다.
영화 예매를 프로그래밍 하기 위해서는 어떤 것이 있어야 할까요 ?
영화 클래스 , 상영 클래스 , 할인 클래스 등 다양한 것들이 있겠지요 ?
그리고 저였어도 클래스나 DB구조 등을 먼저 생각했을 것 같습니다.
그런데 저자는 얘기합니다. 객체 지향 프로그래밍은 "객체"를 먼저 생각해야 한다구요.
우리가 말로는 객체지향이라고 하지만 가장 먼저 생각하는 것은 객체의 상위 개념들입니다.
그러니 진정한 객체지향을 위해서는 우리의 초점을 객체에 맞춰야 합니다.
그러기 위해 저자는 두 가지 방법을 제안합니다.
- 클래스를 고민하기 전에 어떤 객체가 필요한지 고민하라
- 객체를 독립적인 존재가 아닌 기능을 구현하기 위해 협력하는 공동체의 일원으로 보아라
이 두 가지 방법을 통해 필요한 객체들을 정리한 후에 공통된 특성과 상태를 가지는 객체들을 묶어서 클래스로 확장해 나가야 합니다.
정말 객체지향스럽게 시작하는 것이지요.
🐳 객체 캡슐화를 위한 전제
잠시 학교에서 배웠던 것을 생각해 봅시다.
대학교 2학년 때 캡슐화에 대해 배울 때 생각해 보면 데이터와 메소드를 묶어 하나의 덩어리로 만든다고 설명을 들었던 것 같습니다.
( 물론 그때 교수님도 열심히 설명해 주셨겠지만 그때의 나는 간절하지도 배우고자 하는 열의도 적어 이해하지 못했던 것 같습니다... 죄송합니다 교수님 )
그런데 이러한 캡슐화는 도대체 왜 필요할까요 ?
우린 이 문제에 대해 알아보기 전에 좀 더 근본적인 객체에 대한 두 가지 사실을 알아야 합니다.
- 객체는 상태와 행동을 가지는 복합적인 존재다.
- 객체는 스스로 판단하고 행동하는 자율적인 존재다.
이 두 가지 사실에 입각해 캡슐화를 설명해 보겠습니다.
🐳 캡슐화는 왜 필요할까 ?
위에서 얘기한 것처럼 객체는 상태와 행동을 가지는 복합적인 존재입니다.
캡슐화는 위에서 말한 상태(데이터)와 행동(기능)을 객체 내부로 함께 묶는 것입니다.
이렇게 묶은 후에 우리는 캡슐화한 객체를 접근제어를 통해 객체내부에 접근을 통제해야합니다.
그러면 왜 우리는 접근을 통제해야 할까요 ?
왜냐하면 객체는 스스로 판단하고 행동하는 자율적인 존재이기 때문입니다.
그런데 그게 접근 통제왜 무슨 상관이냐구요 ?
지금부터 설명해 보겠습니다.
캡슐화를 한 객체를 접근제어를 통해 데이터와 기능을 숨긴 후에 외부에서 접근 가능한 부분을 우리는 인터페이스라고 합니다.
그리고 캡슐화한 객체 내부에서 일어나는 일을 우리는 구현이라고 합니다.
접근 제어를 하는 이유는 인터페이스를 통해 객체 외부에서 객체에 접근하지만 내부에서 일어나는 구현에 대해서는 알지 못하게 하기 위해서입니다.
예를 들어 카페라는 객체가 있다고 해봅시다.
우리는 이 카페에 직원이라는 인터페이스를 통해 커피(데이터)에 접근하고자 합니다.
제가 커피를 시키러 갔다고 해봅시다.
저는 카운터 직원분을 통해 커피를 주문합니다.
여기서 카운터 직원분은 객체의 인터페이스가 되겠지요 ?
그러면 직원분은 카페 내부에 일하는 바리스타를 통해 커피를 만들게 됩니다.
우리는 커피가 어떻게 만들어지는지 알 수가 없기에 바리스타분은 자율적으로 커피를 내릴 수 있게 됩니다.
이것이 카페(객체) 내부에서 일어나는 일(구현)을 숨기는 것이지요.
조금 이해가 되셨나요 ?
접근 제어를 통해 객체 내부의 정보를 숨기고 인터페이스를 드러내어 접근하게 하면
내부에서 일어나는 구현을 숨길 수 있어 객체는 자율성을 가지고 스스로 판단해 행동할 수 있게 됩니다.
위에서 말한 두 번째 객체에 대한 사실입니다.
그렇기 때문에 우리는 데이터와 기능을 한 데 모아놓는 객체 캡슐화를 해야하고 접근제어자를 통해 내부의 접근을 제어함으로써 객체에게 자율성을 부여할 수 있게 되기 때문에 우리는 캡슐화를 사용합니다.
🐳 캡슐화를 통해 얻는 이점은 무엇일까 ?
위에서 제시한 예시처럼 다시 커피를 사러 갔다고 생각해 봅시다.
커피를 구매하는 입장에서는 알아야 할 것이 무엇일까요 ?
커피의 가격, 원두의 종류 등 객체가 외부에 공개한 데이터(인터페이스)만 우리는 알면 될 것입니다.
안에서 커피를 내리는 과정, 누가 내리는지는 우리가 알 필요가 없는 것입니다. ( 물론 커피를 내리는 방법에 따라 다르지만 ... 시적허용이라고 생각해 주시면 감사하겠습니다 )
이를통해 알 수 있는 것은 클라이언트는 내부에서 일어나는 (구현)에 대해서 알 필요가 없다는 것입니다.
그렇다면 내부에서 일하는 바리스타의 입장에서 생각해 봅시다.
바리스타는 주문을 받은 후 여러가지 방법을 통해 커피를 내릴 수 있습니다. 왜냐하면 클라이언트는 내부에서 일어나는 일을 알지 못하기 때문입니다.
그렇기 때문에 커피를 내리는 방법을 바꾸는 것도 어렵지 않을 것입니다.
이처럼 캡슐화를 통해 정보를 은닉하게 되면 객체 내부에서 일어나는 일인 구현을 바꾸는 것이 객체 입장에서는 어렵지 않은 일이 됩니다 !
- 클라이언트는 인터페이스대로 사용하기만 하면 되니 사용이 어렵지 않고
- 개발자들은 내부에서 일어나는 구현을 수정하고 변경하는 것이 용이합니다
캡슐화를 하게 되면 이러한 이점을 얻을 수 있습니다.
'독서' 카테고리의 다른 글
[오브젝트] 책임 주도 설계 적용기 (근태관리) (0) | 2024.03.20 |
---|---|
[오브젝트] 1. 객체,설계 (1) | 2023.11.16 |
[함께 자라기] - 자라기 (0) | 2023.09.27 |