
오늘은 『한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍』을 읽고, 책의 내용과 느낀 점을 정리하도록 하겠습니다.
책을 읽게 된 계기
플러터 내용을 블로그에 정리하면서 객체에 대한 이야기가 나왔습니다. 저는 객체를 사물을 볼 때 고정적인 것과 변경되는 것을 나누고, 그것을 토대로 틀과 상속을 통해 만들어 나가는 것이라고만 생각했지, 정확하게 어떻게 사용하는지, 또 어떻게 설명해야 하는지는 감이 오지 않았습니다. 그래서 부족한 부분을 채우기 위해 이 책을 고르게 되었습니다.
책의 내용
책은 높은 응집도와 낮은 결합도에 대한 설명으로 시작합니다. 많은 서적들, 특히 두꺼운 책들은 이것이 정확하게 어떤 결합도와 응집도인지 짚어 주지 않았던 것 같은데, 이 책은 낮은 결합도를 관계의 의존성, 높은 응집도를 기능의 집중도라고 설명합니다. 이 표현이 참 쉽게 다가왔습니다.
낮은 결합도와 높은 응집도를 만드는 방법
사물의 주도성
저자는 현실 세계의 사물과 객체 세계의 사물이 다르게 작동한다고 말하며, 두 세계의 차이를 사물의 주도성으로 설명합니다. 비행기를 예로 들면, 현실 세계에서 비행기와 엔진은 파일럿의 조작에 따라 움직이는 수동적인 존재입니다. 하지만 이런 수동적인 존재도 객체지향으로 구현될 때는 스스로 판단합니다.
객체 간의 협력에 집중
'점'보다는 '선'으로 접근해야 합니다. 객체 하나하나보다 객체 간의 협력을 어떻게 할지를 더 중요하게 생각해야 합니다.
객체지향에서의 객체
객체는 데이터(속성)와 기능(메서드)을 모두 포함한, 독립적으로 실행할 수 있는 최소한의 단위입니다. 예를 들면 Pilot pilot = new Pilot();과 같습니다.
속성
속성은 객체가 가지고 있는 고유 값으로, 객체 안에 고정적으로 들어가 있는 변수의 값을 의미합니다.
객체 안에서 속성을 잘 추출하는 방법에 대해, 저자는 속성의 캡슐화만 주의하면 된다고 말합니다. '객체가 주어진 역할을 최대한 잘 수행하기 위해서 어떤 기능이 필요할까?' 하는 관점으로 접근해야 합니다.
메서드
메서드는 객체의 속성을 변경하는 통로입니다. 객체지향이 추구하는 가이드를 따르면 속성은 외부로부터의 접근이 차단되어야 합니다. 그래서 외부에서 객체의 속성을 직접 변경하지 못하도록 private로 선언하고, 메서드로만 접근할 수 있게 합니다. 이러한 캡슐화 규칙을 통해 객체의 무결성과 안정성을 강화할 수 있습니다.
캡슐화
캡슐화는 정보 은닉입니다. 캡슐화를 지키면 정보 은닉 규칙도 함께 지킬 수 있습니다. 정보 은닉은 외부에 필요 없는 정보를 노출하지 않고 숨기는 것입니다.
저자는 정보의 캡슐화를 알고 있는 개발자를 아래와 같이 설명합니다.
- 되도록 속성을 private로 만들고 getter/setter 메서드로 호출하는 습관을 가집니다.
- 변하는 기능과 변하지 않는 기능을 분리하여 별도의 클래스 그룹으로 추출할 줄 압니다.
- 소프트웨어에서 얼마큼 정보를 보여 주고 감춰야 할지 알고 있습니다.
객체지향의 상속
상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 것입니다. 상속을 통해 자식 클래스는 부모 클래스의 메서드와 속성을 다시 명시하지 않아도, 접근 지정자가 허용하는 범위 안에서 그대로 사용할 수 있게 됩니다.
자바의 접근 지정자
자바에서는 public > protected > 작성하지 않음(default) > private 순으로 접근 범위를 지정합니다.
- public : 패키지, 상속 유무에 관계없이 모든 곳에서 접근 가능
- protected : 같은 패키지와, 다른 패키지라도 상속받은 클래스에서 접근 가능
- 작성하지 않음 : 같은 패키지에서만 접근 가능
- private : 같은 클래스 안에서만 접근 가능하며, 상속받은 클래스도 사용 못함
상속을 사용하는 이유
저자는 상속을 사용하는 이유를 세 가지 관점으로 설명합니다.
코드 관점
- 코드의 재사용이 가능합니다.
- 자식 클래스는 부모 클래스의 속성과 기능을 중복 코딩할 필요 없이 그대로 사용합니다.
- 코드 확장이 편리합니다.
- 부모의 코드만 수정하면 상속받은 자식 클래스는 자동으로 같이 수정됩니다.
개발 편의성 관점
- 인간에게 익숙한 분류와 범주의 개념 적용
- 인간에게 익숙한 사물의 분류와 범주화를 상속을 통해 계층 관계와 코드로 표현할 수 있습니다.
낮은 관계의 의존성과 높은 기능의 집중도를 위한 관점
- 오버라이딩 기능
- 부모 클래스의 메서드(기능)를 자신에게 맞게 재정의할 수 있습니다.
- 다형성
- 상속과 오버라이드를 연동하여 다형성이라는 객체지향 요소를 구현할 수 있습니다.
그 밖의 내용
이 외에도 상속은 어떻게 하는지, 다형성이란 무엇인지, 어떻게 하면 객체 구현의 원리를 인지할 수 있는지, 디자인 패턴은 어떻게 적용하는지 등 많은 내용이 이 책에 담겨 있습니다.
마무리
오늘은 『한 번 읽으면 두 번 깨닫는 객체지향 프로그래밍』을 읽고 결합도와 응집도, 객체와 속성·메서드, 캡슐화, 상속에 대해 정리하였습니다.
저는 개인적으로 이 책을 3번 정도 정독한 것 같습니다. 다만 예제가 상세하게 나와 있지 않다는 점은 아쉬웠습니다. 프로그래밍을 기본적으로 알지 못하는 분들은 예제를 보면서 쉽게 따라가기 어려울 것으로 생각됩니다. 그럼에도 이 책을 리뷰하는 이유는, 객체에 대해 명확하게 설명하지 못했던 제 생각이 자리를 잡을 수 있었고, 디자인 패턴 부분에서 다형성을 이렇게도 사용할 수 있다는 것을 깨우칠 수 있는 부분이 분명 있었다고 생각하기 때문입니다.
현재 Flutter를 공부하고 있어서, 예제는 Flutter 기반으로 작성하면서 이해해 보았습니다.
예제 코드 : https://github.com/qkrxodud/object_pratice_first/tree/main/lib
댓글
GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.