Post

『객체지향의 사실과 오해』 독서 후기

한줄 후기

클래스(Class)만 사용하면 객체 지향이라고 생각했던 오해를 풀 수 있었습니다.

긴 후기

먼 과거에 코딩 학원에 잠깐 다닌적이 있었는데, 객체에 대해 설명한다면서 클래스만 주구장창 설명했던 기억이 납니다. 그래서 클래스를 사용하면 객체 지향이구나 하고 이해했습니다.

그런데 최근 개발자로 취업을 준비하면서 기본서를 다시 보다보니 제가 이해하고 있던 것과는 뭔가 다른 소리를 합니다. 객체는 사용자가 만든 타입(Type)이고, C언어도 객체 지향적으로 프로그래밍이 가능하다는 등 클래스는 말도 안꺼냅니다. 그렇다고 시원하게 설명을 해주지는 않아서 『객체지향의 사실과 오해』를 구매하게 되었습니다.

읽다보니 새로운 지식 뿐만 아니라, 잘못된 지식을 바로잡을 수 있어 재밌게 읽을 수 있었습니다. 클래스를 사용하는게 객체 지향은 아니라는 것부터 시작해서, 왜 해야되는지 이유도 모른채 외웠던 캡슐화가 결국엔 캡슐화가 됨으로써 객체의 자율성독립성이 생겨 대체 가능하게 하는 등 모두 별개의 지식으로 암기했던 지식이 다 연결되어 있다는 걸 알 수 있었습니다. 그리고 다양한 객체 지향 이론의 중심에는 객체 간에 주고받는 메시지(Message)가 있다는 점까지 이해할 수 있었습니다.

책의 후반부에는 간단하게 커피 전문점 도메인으로 객체 지향 이론을 적용해보는 예시가 있어서, 책의 내용을 실제로 어떻게 적용해야되는건지에 대한 답답함을 조금이나마 해소해 줍니다. 그래서 저도 뭔가 해볼 수 있을 것 같은 근자감이 생겨서 책을 거의 다 읽어갈 때 즈음 뭔가 객체 지향적으로 직접 만들어보는게 좋겠다는 생각을 했습니다. 그래서 최대한 작게 프로그램을 만들어서 실습해봤는데(링크), 망했습니다. 그리고 잘못했던 점을 고려하며 다시 도메인 모델부터 만들었는데(링크), 먼저 요구사항 도출해야하는 걸 깜빡했습니다. 머리속에 제대로 정리도 안된 상태에서 마음만 앞서 적용해보려다 이런 상황이 된 것 같습니다.

마지막으로 부록에서는 추상화 기법을 다룹니다. 전체적으로 좋았지만 그중에 상속에 대한 내용이 기억에 남습니다. Java 기본서에서 대체 가능성을 보여주려고 했던건지는 잘 모르겠지만, 슈퍼클래스(superclass)에 서브클래스(subclass) 인스턴스를 대입하고, 슈퍼클래스를 이용해서 서브클래스의 메서드를 호출하는 예제를 보여주고는 합니다. 보면서 ‘그래서 뭐 어쩌라는거지?’라는 느낌이 들었었는데, 아래와 같은 책의 내용을 읽고 난 후에 어떤 상황에서 앞서 언급한 기본서의 예제들을 활용해야되는건지 알 수 있었습니다.

어떤 프로그래밍 언어도 상속이 대체 가능성을 만든다는 것을 보장하지 않는다. 상속서브타이핑(subtyping)서브클래싱(subclassing)의 두 가지 용도로 사용될 수 있다. 서브클래스가 슈퍼클래스를 대체할 수 는 경우 이를 서브타이핑이라고 한다. 서브클래스가 슈퍼클래스를 대체할 수 는 경우에는 서브클래싱이라고 한다. 서브타이핑은 설계의 유연성이 목표인 반면 서브클래싱은 코드의 중복 제거와 재사용이 목적이다. 흔히 서브타이핑인터페이스 상속(interface inheritance)이라고 하고, 서브클래싱구현 상속(implementation ineheritance)이라고 한다.

제가 부족해서 겠지만, 이 책을 읽고서 ‘객체 지향은 이런거야’라고 자신있게 말 할 수는 없는 것 같습니다. 아직도 이런저런 정의를 혼자 내려보면서 이게 맞을까 고민하고 있습니다. 또 객체지향의 모든 것을 다루고 있지도 않습니다. 하지만 객체 지향에 대한 잘못된 개념을 인지하는데 도움이 되고, 어렴풋이만 알고만 있던 객체 지향 관련 원칙이나 용어에 대해 더 공부할 수 있게 해주는 책인 것은 확실합니다.

저자분이 예시와 함께 이해하기 쉽게 설명해주셔서 완벽히 이해했다는 착각에 빠질 정도이므로, 저와 같은 객체 지향 초보자 분들과 객체 지향에 대해 아직 오해가 있으신 분들은 읽어보시는 것을 추천드립니다. 대략 250 페이지 정도로 부담스럽지 않게 읽을 수 있습니다.

저자 분의 다음 책인 『오브젝트』를 보면서 제 나름대로 적용을 해보면 객체 지향에 한 걸음 더 다가갈 수 있지 않을까 막연한 기대를 해봅니다. 읽어보고 싶은 책이 너무 많아서 뭐 부터 봐야할지 고민되네요.

쓰고 보니까 저도 읽고 싶지 않을 정도로 글만 주구장창 써 내려갔네요. 다음에는 재밌게 읽을 수 있는 글을 쓰도록 노력해야겠습니다.

참고: javascript의 클래스

책에서 javascript에는 클래스가 없다고 하지만, ES6(ECMAScript 2015)에서 javascript에 클래스가 도입되었습니다. 책 출간 년도가 2015년이라 이와 관련한 내용은 반영되지 못한 것 같습니다.

그런데 javascript의 클래스는 내부적으로 프로토타입을 기반으로 동작합니다. 아직 javascript 기본 문법만 보고있는 수준이라 깊은 내용을 다룰 수는 없지만, 참고용으로 작성해 둡니다.


2023-04-28 javascript 수업을 듣다보니 교재로 사용하는 『모던 자바스크립트 입문』(이소히로시, 서재원, 길벗)에 참고할만한 내용이 적혀있어 추가합니다.

클래스 구문은 함수를 정의한다. 클래스를 정의하지 않는다.

ECMAScript 6부터 추가된 클래스 구문은 생성자 함수를 간결하게 작성하기 위한 문법 요소라는 점에서 C++나 Java 등의 클래스와는 차이가 있습니다. 클래스 구문이 추가되었음에도 자바스크립트의 객체 지향 메커니즘은 바뀐 것이 없습니다. 클래스 구문을 사용할 때 늘 이 점에 유의하세요. 클래스 구문은 그 배경지식인 자바스크립트 객체의 메커니즘과 프로토타입 상속을 제대로 이해한 후에 사용해야 합니다.

This post is licensed under CC BY 4.0 by the author.