Study

객체지향 프로그래밍이란?

voider 2021. 2. 27. 09:31

객체지향 프로그래밍이란 무엇인가?

서론

객체는 현실 세계로 비유하자면 우리가 보고 느끼고 듣는 것 모든 것이 객체가 될 수 있습니다. 지금 이 글을 쓰고 있는 키보드도 하나의 객체로 볼 수 있습니다. 더 섬세하게 들어가서, 키보드를 감싸고 있는 키캡 하나하나가 모두 객체라고 할 수도 있습니다. 여기서 객체를 지향한다는 것이 무엇인지 힌트를 얻을 수 있습니다.

키캡 하나도 객체가 될 수 있다고 했습니다. 그런데 만약 내가 '키보드'라는 단어를 입력하고 싶은데 'ㅣ'를 가리키는 단 하나의 키캡만 존재한다면 어떨까요? 'ㅣ'은 키보드라는 글자를 완성하는데 필요한 요소지만, 그 자체만으로는 아무 의미가 없습니다. 'ㅋ', 'ㅂ', 'ㅗ'와 같은 키캡이 있어야만 '키보드'라는 단어를 완성할 수 있습니다. 객체도 마찬가지입니다. 외딴섬 같은 객체는 아무 의미가 없습니다. 객체는 다른 객체와 협력할 때 비로소 의미를 가집니다. 객체는 협력하기 위해 존재합니다.

본론

객체지향은 어느 하나가 무리한 책임을 지지 않도록 작은 단위로 책임을 분산시키는 프로그래밍 방법론입니다. 작게 나눈 책임을 '객체'에 할당합니다. 객체는 자신의 책임 혹은 역할을 수행하고, 자신의 책임이 아닌 일은 적절한 객체에게 위임합니다. 이렇게 작은 책임을 가진 객체들끼리 협력하여 큰 책임을 가진 소프트웨어를 완성해나가는 것이 객체지향 프로그래밍의 핵심인 것 같습니다.

객체지향의 대표적인 특징 네 가지로 캡슐화, 상속, 추상화, 다형성 꼽을 수 있습니다. 객체는 협력에 필요한 추상화된 메세지 혹은 메서드만을 외부에 공개하고 구현부는 외부에서 접근할 수 없도록 캡슐화합니다. 객체와 객체가 추상화된 메세지로만 협력함으로써 결합도 낮춥니다(row - coupling). 또한 상속은 결합도가 높아진다는 단점이 있지만 적절히 사용하면 반복되는 코드를 줄일 수 있습니다. 마지막으로 다형성은 추상화를 통해 유연한 프로그래밍을 가능하게 합니다. 역할만 같다면 어떤 객체든 상관없다는 것입니다. 이를 테면 인터페이스나 슈퍼 클래스 타입을 파라미터로 선언한 경우, 그것을 구현/상속하는 어떤 객체도 들어올 수 있습니다. 구체적으로 '특정 객체가 필요하다'가 아닌, '어떤 역할/책임을 수행할 수 있는 객체가 필요하다'고 추상화하여 유연성을 더합니다. 이 방식으로 인터페이스의 구현체 혹은 서브클래스가 달라지더라도 그것에 의존하는 객체들에게 영향을 끼치지 않을 수 있습니다.

정리하자면, 적절한 책임과 역할을 객체에 할당하고, 캡슐화/추상화/상속/다형성을 통해 낮은 결합도를 유지하면서도 협력하는 소프트웨어를 만들어나가는 것이 객체지향의 목표라고 볼 수 있을 것 같습니다.