이렇듯 자바하면 객체지향이 떠오를 정도로 자바는 (자바를 많이 참조한) C#과 더불어 객체 지향을 거의 완벽에 가깝게 구현하고 있는 언어라고 볼 수 있습니다. 필자는 C언어로 진행해야 할 프로젝트에서 다형성을 구현하기 위해 (다들 골치아파하는) 함수 포인터를 사용하기도 했었는데, 이와 비교하면 자바나 C#같은 객체지향 언어는 매우 쉽게 객체지향기법을 적용할 수 있도록 하고 있습니다.
객체 지향을 사용하는 여러가지 이유가 있겠지만, 저는 주로 다음과 같은 이유로 객체지향 기법을 사용합니다.
- 재사용과 확장
- 생각하는 방식과 설계의 일치성
너무 뻔하다구요? 하지만 이 뻔한 걸 실천해 옮기는 경우가 생각보다 많지 않다는 걸 아시는지요?
1. 재사용과 확장
재사용은 이미 절차방식의 언어에서부터 그 중요성이 강조되어 왔습니다. C 언어의 경우는 라이브러리를 만들어 배포할 수 있는 기능이 있으며, 이를 통해 개발자들은 남이 잘 만들어 놓은 라이브러리를 사용해서 보다 쉽게 프로그래밍을 할 수 있었습니다. 예를 들어, 15년 전 MS-DOS가 유행할 때에는 터보C 등에서 사용할 수 있는 한글 라이브러리가 인기가 많았으며, 많은 개발자들이 직접 한글처리 부분을 구현하지 않아도 어플리케이션에서 한글을 지원할 수 있었습니다.
객체지향의 꽃인 클래스의 재사용성은 C 언어보다 한층 강화되었습니다. 남이 만든 기능을 재사용할 수 있을 뿐만 아니라 더불어 남이 만든 기능을 확장할 수 있게 된 것이죠. 예를 들어, 전 최근에 진행한 프로젝트에서 객체-관계테이블 매핑(ORM) API로 Hibernate를 사용했었는데, Hibernate의 특정 기능 중 일부를 필요에 의해 확장해서 사용했습니다. 이를 통해 보다 빠르고 보다 프로젝트에 알맞게 Hibernate를 사용할 수 있었습니다.
비단 남이 만든 클래스뿐만 아니라 본인이 만든 클래스를 재사용할 수 있을 것입니다. 클래스를 재사용할 수 있도록 설계하고 구현하면, 나중에 반드시 적은 노력과 적은 시간으로 더 많은 걸 개발해 낼 수 있는 보상을 받게 됩니다.
2. 생각하는 방식과 코드의 일치성
아마 두번째 이유가 객체지향을 사용하는 이유중 가장 흥미로운 이유일 것입니다. 사실 재사용성은 꼭 객체지향이 아니더라도 (코드 차원에서의 재사용이든 라이브러리 형태의 재사용이든) 구현할 수 있습니다. 하지만, 생각하는 방식과 조금이나마 비슷한 구조로 코드를 구성할 수 있는 건 객체지향언어뿐입니다.
어셈블리어, 포트란, 코볼에서부터 C에 이르기까지 비객체지향 언어는 머리속에 떠오른 생각들을 언어에 그대로 매핑할 수가 없습니다. 마치 수학 문제를 풀듯, 언어에 알맞게 문제를 풀어나가야 합니다.
하지만, 객체지향 기법은 다릅니다. 머리속에서 생각하고 있던 개념들을 객체라는 걸로 매핑시킬 수가 있습니다. 머리속에서 사람, 동물, 자동차, 도시 라는 개념을 떠올렸다면 그런 개념과 매핑되는 객체(클래스)를 그려낼 수가 있습니다. 이는 설계를 좀더 빠르게 할 수 있도록 해 줍니다.
예를 들어, 인터넷 사이트의 팝업창을 생각해보죠. 인터넷 사이트에서 팝업창을 띄우기 위해서는 언제 팝업창이 떠야 하는지 관리할 필요가 있습니다. 그리고 팝업창에 무엇을 보여줄지에 대한 정보도 필요하구요. 이를 객체지향기법으로 설계를 해 본다면 다음과 같이 두개의 클래스를 가장 먼저 떠올릴 수 있겠죠.
팝업관리자, 팝업창
이 두 클래스는 몇차례의 정련 과정이 필요하겠지만, 머리속에 생각한 걸 곧바로 설계와 연결시킬 수 있다는 건 분명히 객체지향의 큰 장점입니다. 게다가 머리속에서 상상한 걸 설계와 바로 연결시킬 수 있기에 설계가 복잡하지 않고 쉬워진다는 장점도 있습니다. (절대 쉽지 않다고 말하는 분도 계시겠지만, 패턴이니 프레임워크니 하는 등의 객체지향의 겉멋만 익히지 말고 본질을 익히시면 설계가 쉬워집니다.)
이 두가지 외에도 객체지향기법을 사용하는 여러가지 이유가 있지만 저의 경우는 이 두가지가 객체지향을 사용하는 가장 큰 이유이며, 이 두가지 때문에 설계나 개발의 속도가 빨라질 수 있기도 했습니다.
객체지향 언어를 사용할 때에는 객체지향기법을 사용할 때 비로서 빛이 난다는 걸 잊지 마세요. JSP/ASP 프로그래밍을 할 때 마치 "C 또는 베이직" 스타일로 프로그래밍 한다면, 그건 객체지향기법을 도입했을 때 얻을 수 있는 장점을 버리고 절차적 언어의 단점만 따라하겠다는 것이나 마찬가지입니다.
여러분도 자바나 C# 등과 같은 객체지향 언어를 기반으로 개발할 때에는 객체지향기법의 장점을 살릴 수 있도록 노력하다보면, 그에 상응하는 보상을 얻을 수 있게 될 것입니다.