객체지향으로 향하는 두 번째 걸음은 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 존재로 바라보는 것입니다.
세 번째 걸음을 내디딜 수 있는지 여부는 협력에 참여하는 객체들에게 얼마나 적절한 역할과 책임을 부여할 수 있느냐에 달려 있습니다.
객체지향의 마지막 걸음은 앞에서 설명한 개념들을 여러분이 사용하는 프로그래밍 언어라는 틀에 흐트러짐 없이 담아낼 수 있는 기술을 익히는 것입니다.
이 책은 객체지향으로 향하는 세 번째와 네 번째 걸음에 초점을 맞추고 있습니다. 이 책을 읽고 나면 객체에서 적절한 약할과 책임을 부여하는 방법과 유연하면서도 요구사항에 적절한 협력을 설계하는 방법을 알게 될 것입니다. 나아가 프로그래밍 언어라는 도구를 이용해 객체지향의 개념과 원칙들을 오롯이 표현할 수 있는 방법을 익힐 수 있을 것입니다.
첫 번째와 두 번째는 같은 저자의 객체지향의 사실과 오해에서 설명하고 있습니다.
한 가지 염두에 둬야 할 점은 이 책에서 제시하는 방법이 객체지향을 구현하기 위한 유일한 방법은 아니라는 점입니다. 이 책을 목적지가 아니라 출발점으로 생각하기 바랍니다.
추천사
소프트웨어 개발의 역사가 시작된 이래로 등장한 거의 모든 프로그래밍 언어, 기술, 방법론은 소프트웨어 개발 중에 필연적으로 마주하게 되는 복잡함이라는 문제를 해결하려는 공통적인 목표를 공유합니다.
개발자들은 복잡한 코드를 이해하기 쉬운 관점으로 바라볼 수 있는 방법이 있다면 이를 더 손쉽게 다를 수 있다는 것을 알게 됐습니다.
시스템을 독립적인 기능을 담당하는, 재사용 가능한 프로시저의 구성으로 보는 방법이 그중 하나입니다.
이와 다르게 시스템을 객체와 구성으로 보는 방법이 있습니다.
객체에게 명령 대신 요청을 담은 메시지를 전달하면 객체는 이를 어떻게 처리할지 자율적으로 판단하고, 내부에 가지고 있는 데이터를 이용해 필요한 작업을 수행하는 방식입니다.
책임과 권한을 가진 객체들이 서로 메시지를 주고 받으며 협력해서 필요한 기능을 수행하도록 시스템을 개발하는 객체지향 프로그래밍(OOP) 입니다.
객체지향은 크고 복잡한 시스템을 효과적으로 분해하고 구성할 수 있고, 손쉽게 이해하고 효율적으로 다룰 수 있게 도와주는 방법으로 인정받아 많은 프로그래밍 언어에 적용돼 왔고 지금은 가장 인기 있는 프로그래밍 패러다임으로 자리 잡았습니다.
개발자의 관심을 클래스라는 틀 안에서 절차를 기술하는 방식으로부터 실행 시점에 다른 객체와 동적으로 관계를 맺고 인터페이스를 통해 요청을 받아 처리하는 빈이라 불리는 객체와 그 관계로 옮기게 해준 것이 스프링이 성공한 비결입니다.
유행하는 기술의 사용법을 공부하는 건 당장 일자리를 구하는 데 도움이 될 것입니다. 반면 객체에 다시 관심을 가지는 것, 시스템을 자율적인 객체가 서로 협력해서 일을 하는 공동체라는 시각으로 바라보고 설계하고, 개발하는 방법을 학습하고 익히는 건 개발자로서 평생의 경력에 많은 유익함을 안겨 줄 것입니다.
들어가며 : 프로그래밍 패러다임
01. 패러다임의 시대
패러다임(paradigm)이라는 말은 모델(model), 패턴(pattern), 전형적인 예(example)를 의미하는 그리스어인 파라데이그마(paradeigma)에서 유래했습니다.
과거에는 표준적인 모델을 따르거나 모방하는 상황을 가리키는 매우 제한적인 상황에서만 패러다임이라는 단어를 사용했습니다.
패러다임은 하나의 예로 복사하도록 허용합니다.
현대인들은 패러다임이라는 단어를 전혀 다른 의미로 사용합니다.
우리가 사용하는 패러다임은 한 시대의 사회 전체가 공유하는 이론이나 방법, 문제의식 등의 체계를 의미합니다.
현대의 패러다임의 시작은 타마스 쿤의 ‘과학혁명의 구조’라는 책에서 쓰이게 되었다.
과학이 단수한 계단식 발전의 형태를 이루는 것이 아니라 새로운 발견이 기존의 과학적 견해를 붕괴시키는 혁명적인 과정을 거쳐 발전해왔다고 주장했습니다. 그리고 이를 과학혁명이라고 불렀습니다.
과학혁명이란 과거의 패러다임이 새로운 패러다임에 의해 대체됨으로써 정상과학의 방향과 성격이 변하는 것을 의미합니다. 이를 패러다임 전환(Paradigm Shift)이라고 부릅니다.
패러다임 전환은 소프트웨어 개발에 종사하는 대부분의 사람들에게 익숙한 용어 입니다.
이 책에서 이야기하는 패러다임 전환이란 절차형 패러다임에서 객체지향 패러다임으로의 변화를 가리킵니다.
02. 프로그래밍 패러다임
프로그래밍 언어는 일반적으로 어떤 패러다임의 사용을 권장하고 다른 패러다임의 사용을 막습니다.
프로그래밍 패러다임(programming paradigm)이라는 용어를 처음 사용한 사람은 1974년에 전산학의 노벨상이라 불리는 튜링상을 수항한 로버트 플로이드입니다.
우리가 어떤 프로그래밍 패러다임을 사용하느냐에 따라 우리가 해결할 문제를 바라보는 방식과 프로그램을 작성하는 방법이 달라집니다.
프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지합니다. 또한 프로그래밍 패러다임을 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장할 수 있도록 준비시킬 수 있습니다.
이 책은 코드를 개발하는 우리가 객체지향 패러다임이라는 용어를 사용할 때 완벽하게 동일하지는 않더라도 어느 정도 유사한 그림을 머릿속에 그릴 수 있는 기반을 제공할 것입니다. 또한 객체지향에 대한 다양한 오해를 제거함으로써 객체지향 프로그래밍을 하는 개발자들이 동일한 규칙과 표준에 따라 프로그램을 작성할 수 있게 할 것입니다.
각 패러다임과 패러다임을 채용하는 언어는 특정한 종류의 문제를 해결하는 데 필요한 일련의 개념들을 지원합니다. 이것이 프로그래밍 언어와 프로그래밍 패러다임을 분리해서 설명할 수 없는 이유입니다.
C 언어는 절차형 패러다임을 기반으로 하는 언어입니다.
자바는 객체지향 패러다임을 기반으로 하는 언어입니다.
언어는 리스프(LISP)는 함수형 패러다임을 수용한 가장 대표적인 언어입니다.
프롤로그(PROLOG)는 논리형 패러다임을 수용한 대표적인 언어입니다.
코드 없이 개념적으로 특정 프로그래밍 패러다임을 설명하는 것은 어떤 영감도 주지 못합니다. 개발자는 코드를 통해 패러다임을 이해하고 적용할 수 있는 기술을 습득해야만 합니다.
절차형 패러다임에서 객체지향 패러다임으로 전환됐다고 해서 두 패러다임이 함께 존재할 수 없는 것은 아닙니다. 오히려 서로 다른 패러다임이 하나의 언어 안에서 공존함으로써 서로 장단점을 보완하는 경향을 보입니다. 대표적인 예러 절차형 패러다임과 객체지향 패러다임을 접목시킨 C++와 함수형 패러다임과 객체지향 패러다임을 접목시킨 스칼라가 있습니다. 이처럼 하나 이상의 패러다임을 수용하는 언어를 다중패러다임 언어(Multiparadigm Language)라고 부릅니다.
프로그래밍 패러다임이 바뀌었다고 해서 프로그래머가 바라보는 세상이 완전히 달라지는 것이 아닙니다. 객체지향 패러다임은 절차형 패러다임의 단점을 보완했지만 절차형 패러다임의 기반 위에서 구축됐습니다. 따라서 절차형 패러다임과 객체지향 패러다임을 비교하는 것은 가능합니다.
패러다임은 과거의 패러다임을 폐기시키는 혁명적인 과정을 거치지 않는 것으로 보입니다. 오히려 과거에 있던 패러다임의 단점을 보완하는 발전적인 과정을 거치는 것으로 보입니다. 간단히 말해 프로그래밍 패러다임은 혁명적(revolutionary)이 아니라 발전적(evolutionary)입니다.
이런 사실은 비록 객체지향 패러다임을 주로 사용한다고 하더라도 다른 패러다임을 배우는 것이 도움이 될 것이라는 사실을 암시합니다. 은총알은 없다라는 프레디 브룩스의 말을 기억해야 합니다. 객체지향 패러다임은 은총알이 아닙니다. 객체지향이 적합하지 않는 상황에서는 언제라도 다른 패러다임을 적용할 수 있는 시야를 기르고 지식을 갈고 닦아야 합니다.