지은이의 글

  • 객체지향으로 향하는 첫 걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작합니다.
  • 객체지향으로 향하는 두 번째 걸음은 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 존재로 바라보는 것입니다.
  • 세 번째 걸음을 내디딜 수 있는지 여부는 협력에 참여하는 객체들에게 얼마나 적절한 역할과 책임을 부여할 수 있느냐에 달려 있습니다.
  • 객체지향의 마지막 걸음은 앞에서 설명한 개념들을 여러분이 사용하는 프로그래밍 언어라는 틀에 흐트러짐 없이 담아낼 수 있는 기술을 익히는 것입니다.
  • 이 책은 객체지향으로 향하는 세 번째와 네 번째 걸음에 초점을 맞추고 있습니다. 이 책을 읽고 나면 객체에서 적절한 약할과 책임을 부여하는 방법과 유연하면서도 요구사항에 적절한 협력을 설계하는 방법을 알게 될 것입니다. 나아가 프로그래밍 언어라는 도구를 이용해 객체지향의 개념과 원칙들을 오롯이 표현할 수 있는 방법을 익힐 수 있을 것입니다.
    • 첫 번째와 두 번째는 같은 저자의 객체지향의 사실과 오해에서 설명하고 있습니다.
  • 한 가지 염두에 둬야 할 점은 이 책에서 제시하는 방법이 객체지향을 구현하기 위한 유일한 방법은 아니라는 점입니다. 이 책을 목적지가 아니라 출발점으로 생각하기 바랍니다.

추천사

  • 소프트웨어 개발의 역사가 시작된 이래로 등장한 거의 모든 프로그래밍 언어, 기술, 방법론은 소프트웨어 개발 중에 필연적으로 마주하게 되는 복잡함이라는 문제를 해결하려는 공통적인 목표를 공유합니다.
  • 개발자들은 복잡한 코드를 이해하기 쉬운 관점으로 바라볼 수 있는 방법이 있다면 이를 더 손쉽게 다를 수 있다는 것을 알게 됐습니다.
  • 시스템을 독립적인 기능을 담당하는, 재사용 가능한 프로시저의 구성으로 보는 방법이 그중 하나입니다.
  • 이와 다르게 시스템을 객체와 구성으로 보는 방법이 있습니다.
  • 객체에게 명령 대신 요청을 담은 메시지를 전달하면 객체는 이를 어떻게 처리할지 자율적으로 판단하고, 내부에 가지고 있는 데이터를 이용해 필요한 작업을 수행하는 방식입니다.
  • 책임과 권한을 가진 객체들이 서로 메시지를 주고 받으며 협력해서 필요한 기능을 수행하도록 시스템을 개발하는 객체지향 프로그래밍(OOP) 입니다.
  • 객체지향은 크고 복잡한 시스템을 효과적으로 분해하고 구성할 수 있고, 손쉽게 이해하고 효율적으로 다룰 수 있게 도와주는 방법으로 인정받아 많은 프로그래밍 언어에 적용돼 왔고 지금은 가장 인기 있는 프로그래밍 패러다임으로 자리 잡았습니다.
  • 개발자의 관심을 클래스라는 틀 안에서 절차를 기술하는 방식으로부터 실행 시점에 다른 객체와 동적으로 관계를 맺고 인터페이스를 통해 요청을 받아 처리하는 빈이라 불리는 객체와 그 관계로 옮기게 해준 것이 스프링이 성공한 비결입니다.
  • 유행하는 기술의 사용법을 공부하는 건 당장 일자리를 구하는 데 도움이 될 것입니다. 반면 객체에 다시 관심을 가지는 것, 시스템을 자율적인 객체가 서로 협력해서 일을 하는 공동체라는 시각으로 바라보고 설계하고, 개발하는 방법을 학습하고 익히는 건 개발자로서 평생의 경력에 많은 유익함을 안겨 줄 것입니다.

들어가며 : 프로그래밍 패러다임

01. 패러다임의 시대

  • 패러다임(paradigm)이라는 말은 모델(model), 패턴(pattern), 전형적인 예(example)를 의미하는 그리스어인 파라데이그마(paradeigma)에서 유래했습니다.
    • 과거에는 표준적인 모델을 따르거나 모방하는 상황을 가리키는 매우 제한적인 상황에서만 패러다임이라는 단어를 사용했습니다.
    • 패러다임은 하나의 예로 복사하도록 허용합니다.
  • 현대인들은 패러다임이라는 단어를 전혀 다른 의미로 사용합니다.
    • 우리가 사용하는 패러다임은 한 시대의 사회 전체가 공유하는 이론이나 방법, 문제의식 등의 체계를 의미합니다.
  • 현대의 패러다임의 시작은 타마스 쿤의 ‘과학혁명의 구조’라는 책에서 쓰이게 되었다.
  • 과학이 단수한 계단식 발전의 형태를 이루는 것이 아니라 새로운 발견이 기존의 과학적 견해를 붕괴시키는 혁명적인 과정을 거쳐 발전해왔다고 주장했습니다. 그리고 이를 과학혁명이라고 불렀습니다.
    • 과학혁명이란 과거의 패러다임이 새로운 패러다임에 의해 대체됨으로써 정상과학의 방향과 성격이 변하는 것을 의미합니다. 이를 패러다임 전환(Paradigm Shift)이라고 부릅니다.
  • 패러다임 전환은 소프트웨어 개발에 종사하는 대부분의 사람들에게 익숙한 용어 입니다.
    • 이 책에서 이야기하는 패러다임 전환이란 절차형 패러다임에서 객체지향 패러다임으로의 변화를 가리킵니다.

02. 프로그래밍 패러다임

  • 프로그래밍 언어는 일반적으로 어떤 패러다임의 사용을 권장하고 다른 패러다임의 사용을 막습니다.
    • 프로그래밍 패러다임(programming paradigm)이라는 용어를 처음 사용한 사람은 1974년에 전산학의 노벨상이라 불리는 튜링상을 수항한 로버트 플로이드입니다.
  • 우리가 어떤 프로그래밍 패러다임을 사용하느냐에 따라 우리가 해결할 문제를 바라보는 방식과 프로그램을 작성하는 방법이 달라집니다.
  • 프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지합니다. 또한 프로그래밍 패러다임을 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장할 수 있도록 준비시킬 수 있습니다.
  • 이 책은 코드를 개발하는 우리가 객체지향 패러다임이라는 용어를 사용할 때 완벽하게 동일하지는 않더라도 어느 정도 유사한 그림을 머릿속에 그릴 수 있는 기반을 제공할 것입니다. 또한 객체지향에 대한 다양한 오해를 제거함으로써 객체지향 프로그래밍을 하는 개발자들이 동일한 규칙과 표준에 따라 프로그램을 작성할 수 있게 할 것입니다.
  • 각 패러다임과 패러다임을 채용하는 언어는 특정한 종류의 문제를 해결하는 데 필요한 일련의 개념들을 지원합니다. 이것이 프로그래밍 언어와 프로그래밍 패러다임을 분리해서 설명할 수 없는 이유입니다.
    • C 언어는 절차형 패러다임을 기반으로 하는 언어입니다.
    • 자바는 객체지향 패러다임을 기반으로 하는 언어입니다.
    • 언어는 리스프(LISP)는 함수형 패러다임을 수용한 가장 대표적인 언어입니다.
    • 프롤로그(PROLOG)는 논리형 패러다임을 수용한 대표적인 언어입니다.
  • 코드 없이 개념적으로 특정 프로그래밍 패러다임을 설명하는 것은 어떤 영감도 주지 못합니다. 개발자는 코드를 통해 패러다임을 이해하고 적용할 수 있는 기술을 습득해야만 합니다.
  • 절차형 패러다임에서 객체지향 패러다임으로 전환됐다고 해서 두 패러다임이 함께 존재할 수 없는 것은 아닙니다. 오히려 서로 다른 패러다임이 하나의 언어 안에서 공존함으로써 서로 장단점을 보완하는 경향을 보입니다. 대표적인 예러 절차형 패러다임과 객체지향 패러다임을 접목시킨 C++와 함수형 패러다임과 객체지향 패러다임을 접목시킨 스칼라가 있습니다. 이처럼 하나 이상의 패러다임을 수용하는 언어를 다중패러다임 언어(Multiparadigm Language)라고 부릅니다.
  • 프로그래밍 패러다임이 바뀌었다고 해서 프로그래머가 바라보는 세상이 완전히 달라지는 것이 아닙니다. 객체지향 패러다임은 절차형 패러다임의 단점을 보완했지만 절차형 패러다임의 기반 위에서 구축됐습니다. 따라서 절차형 패러다임과 객체지향 패러다임을 비교하는 것은 가능합니다.
  • 패러다임은 과거의 패러다임을 폐기시키는 혁명적인 과정을 거치지 않는 것으로 보입니다. 오히려 과거에 있던 패러다임의 단점을 보완하는 발전적인 과정을 거치는 것으로 보입니다. 간단히 말해 프로그래밍 패러다임은 혁명적(revolutionary)이 아니라 발전적(evolutionary)입니다.
  • 이런 사실은 비록 객체지향 패러다임을 주로 사용한다고 하더라도 다른 패러다임을 배우는 것이 도움이 될 것이라는 사실을 암시합니다. 은총알은 없다라는 프레디 브룩스의 말을 기억해야 합니다. 객체지향 패러다임은 은총알이 아닙니다. 객체지향이 적합하지 않는 상황에서는 언제라도 다른 패러다임을 적용할 수 있는 시야를 기르고 지식을 갈고 닦아야 합니다.

참고