개발서적

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

코징 2022. 2. 4. 14:46

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

 책을 읽게 된 계기

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

 

책의 내용

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

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

 

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

1) 사물의 주도성

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

 

2) 객체 간의 협력에 집중해야 된다.

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

 

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

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

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

 

속성이란? 

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

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

 

메서드란?

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

 

캡슐화란? 

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

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

1. 되도록 속성을 private로 만들고 getter//setter 매소드로 호출하는 습관을 갖는다.

2. 변하는 기능과 변하지 않는 기능을 분리하여 별도의 클래스 그룹으로 추출할 줄 안다.

3. 소프트웨어에서 얼마큼 정보를 보여주고, 감춰야 될지 알고 있다.

 

객체지향의 상속

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

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

 

JAVA 예약어 중 접근 지정자

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

- public : 패키지, 상속 유무에 관계없이 모든 곳에서 접근 가능

- protected : 상속받은 모든 곳에서 접근 가능

- 작성하지 않음 : 같은 패키지에서만 접근 가능

- private : 상속받은 클래스도 사용 못함

 

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

 저자는 말한다. 

코드 관점

* 코드의 재사용 가능 

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

*코드의 확장의 편리함

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

 

개발 편의성 관점

* 인간에게 익숙한 분류와 범주의 개념 적용

 - 인간에게 익숙한 사물의 분류와 범주화를, 상속을 통해 계층 관계와 코드로 표현할 수 있다.

 

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

* 오버 라이딩 기능 

 - 부모 클래스의 메서드(기능)를 자신에게 맞게 재정의 할 수 있다.

* 다형성 

 - 상속과 오버라이드를 연동하여 다형성이란 객체지향 요소를 구현할 수 있다.

 

이외에

상속은 어떻게 하는가?

다형성이란 무엇인가?

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

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

 

리뷰

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

 

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

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