~/tech-blog/posts/oop-book-review — zsh

한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍

한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍

책을 읽게 된 계기

오늘은 플러터 블로그 정리를 하면서 객체에 대한 이야기가 나왔습니다. 저는 객체라는 것은 제가 사물을 볼 때 고정적인 것과 변경되는 것을 나누고, 그것을 토대로 틀과 상속을 통해서 만들어 나간다고만 생각했지, 정확하게 어떻게 사용하는지, 또 어떻게 설명해야 되는지 감이 오지 않았습니다. 그래서 부족한 부분을 채우기 위해 이 책을 고르게 되었습니다.

책의 내용

책의 시작은 높은 응집도와 낮은 결합도에 대한 설명입니다. 많은 서적들, 특히 두꺼운 책들은 이것에 대해 정확하게 어떤 결합도와 응집도인지 짚어주지 않았던 것 같은데, 이 책은 말합니다.

낮은 결합도(관계의 의존성), 높은 응집도(기능의 집중도)라고. 이 말이 참 쉽게 다가온 것 같습니다.

낮은 결합도 높은 응집도를 높이는 방법은 뭘까요?

  1. 사물의 주도성

저자는 말합니다. 현실 세계의 사물과 객체 세계의 사물은 다르게 작동한다는 점입니다. 두 세계의 다른 점은 사물의 주도성입니다. 그러면서 비행기를 예시로 드는데, 현실 세계에서의 비행기와 엔진 등은 파일럿의 조작으로 좌우되는 수동적인 존재지만, 비행기와 엔진 등 수동적인 존재가 객체지향으로 구현될 때는 스스로 판단합니다.

  1. 객체 간의 협력에 집중해야 합니다.

'점'보다는 '선'으로 접근해야 합니다. 객체 하나하나보다 객체 간의 협력을 어떻게 해야 할지 더 중요하게 생각해야 합니다.

객체지향에서의 객체는 무엇을 말하는가?

데이터(속성)와 기능(메서드)을 모두 포함한, 독립적으로 실행할 수 있는 최소한의 단위입니다.

예를 들면 Pilot pilot = new Pilot();입니다.

속성이란?

속성은 객체가 가지고 있는 고유 값입니다. 이 말은 객체 안에 고정적으로 들어가 있는 변수의 값을 의미합니다. 그렇다면 객체 안에서 이런 속성들은 어떻게 하면 잘 추출할 수 있을까요? 저자는 말합니다.

속성의 캡슐화만 주의하면 됩니다. '객체가 주어진 역할을 최대한 잘 수행하기 위해서 어떤 기능이 필요할까?' 하는 관점으로 접근해야 합니다.

메서드란?

객체의 속성을 변경하는 통로입니다. 객체지향이 추구하는 가이드를 따르면, 속성은 외부로부터의 접근이 차단되어야 합니다. 외부에서 직접적으로 객체의 속성을 변경하지 못하게 private로 선언하고, 메서드로만 접근 가능하게 합니다. 이러한 캡슐화 규칙을 통해 객체의 무결성과 안정성을 강화시킬 수 있습니다.

캡슐화란?

정보 은닉입니다. 캡슐화를 지키면 정보 은닉 규칙도 함께 지킬 수 있습니다. 정보 은닉은 외부에 필요 없는 정보를 노출하지 않고 숨기는 것입니다.

정보의 캡슐화를 알고 있는 개발자는 아래와 같다고 저자는 말합니다.

  1. 되도록 속성을 private로 만들고 getter/setter 메서드로 호출하는 습관을 가집니다.
  2. 변하는 기능과 변하지 않는 기능을 분리하여 별도의 클래스 그룹으로 추출할 줄 압니다.
  3. 소프트웨어에서 얼마큼 정보를 보여주고 감춰야 할지 알고 있습니다.

객체지향의 상속

부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 것입니다.

상속을 통해서 자식 클래스에서 부모 클래스의 메서드와 속성을 명시하지 않아도 아무 제약 없이 사용할 수 있게 됩니다.

JAVA 예약어 중 접근 지정자

여기서 우리는 종종 자바에서 public > protected > 작성하지 않음 > private 순으로 상속 범위를 지정하는데

  • public : 패키지, 상속 유무에 관계없이 모든 곳에서 접근 가능
  • protected : 상속받은 모든 곳에서 접근 가능
  • 작성하지 않음 : 같은 패키지에서만 접근 가능
  • private : 상속받은 클래스도 사용 못함

상속을 왜 사용하는 것일까요?

저자는 말합니다.

코드 관점

  • 코드의 재사용이 가능합니다.

  • 자식 클래스는 부모 클래스의 속성과 기능을 중복 코딩할 필요 없이 그대로 사용합니다.

  • 코드 확장이 편리합니다.

  • 부모의 코드만 수정하면 상속받은 자식 클래스는 자동으로 같이 수정됩니다.

개발 편의성 관점

  • 인간에게 익숙한 분류와 범주의 개념 적용
    • 인간에게 익숙한 사물의 분류와 범주화를 상속을 통해 계층 관계와 코드로 표현할 수 있습니다.

낮은 관계의 의존성과 높은 기능의 집중도를 위한 관점

  • 오버라이딩 기능
    • 부모 클래스의 메서드(기능)를 자신에게 맞게 재정의할 수 있습니다.
  • 다형성
    • 상속과 오버라이드를 연동하여 다형성이라는 객체지향 요소를 구현할 수 있습니다.

이외에

상속은 어떻게 하는가?

다형성이란 무엇인가?

어떻게 하면 객체 구현의 원리를 인지할 수 있을까?

디자인 패턴은 어떻게 하는가? 등 많은 것들이 이 책에 담겨 있습니다.

리뷰

저는 개인적으로 3번 정도 정독한 것 같습니다. 하지만 책을 읽으면서 좀 아쉬웠다고 생각되는 부분은, 예제가 상세하게 나와 있지는 않다는 것입니다. 기본적으로 프로그래밍을 알지 못하는 사람들이 보면 예제를 보면서 쉽게 따라가기는 어려울 것으로 생각됩니다. 그럼에도 불구하고 이 책을 리뷰하는 이유는 객체에 대해서 명확하게 설명하지 못했던 저의 생각이 자리 잡을 수 있었고, 또한 디자인 패턴 부분에서 다형성을 이렇게도 사용하는가 깨우칠 수 있는 부분이 분명 존재했다고 생각하기 때문입니다.

현재 Flutter를 공부하고 있으므로 예제는 Flutter 기반으로 작성하면서 이해해 보았습니다.

https://github.com/qkrxodud/object_pratice_first/tree/main/lib

댓글

GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.

● main 214 posts UTF-8 LF © 2026 코징 RSS · GitHub