기록이 힘이다.

객체 지향의 사실과 오해 본문

IT서적

객체 지향의 사실과 오해

dev22 2022. 10. 12. 19:30
728x90
 
객체지향의 사실과 오해(위키북스 IT Leaders 23)
『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝게도 많은 사람들이 객체지향의 본질을 오해하고 있다. 가장 널리 퍼져있는 오해는 클래스가 객체지향 프로그래밍의 중심이라는 것이다. 객체지향으로 향하는 첫 걸음은 클래스가 아니라 객체를 바라보는 것에서부터 시작한다. 객체지향으로 향하는 두 번째 걸음은 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 바라보는 것이다. 세 번째 걸음을 내디딜 수 있는지 여부는 협력에 참여하는 객체들에게 얼마나 적절한 역할과 책임을 부여할 수 있느냐에 달려 있다. 객체지향의 마지막 걸음은 앞에서 설명한 개념들을 프로그래밍 언어라는 틀에 흐트러짐 없이 담아낼 수 있는 기술을 익히는 것이다. 객체지향이란 무엇인가? 이 책은 이 질문에 대한 답을 찾기 위해 노력하고 있는 모든 개발자를 위한 책이다.
저자
조영호
출판
위키북스
출판일
2015.06.17

역할, 책임, 협력 관점에서 본 객체지향

 

선택한 이유

어렴풋이 알고 있는 '객체'에 대한 정확한 이해가 필요했다. 주니어가 읽기에 좋은 책이었다. 
내용

'이상한 나라의 앨리스'에 비유하여 객체를 설명하고 있다. 등장인물과 사건을 통한 객체의 설명은 누구나 쉽게 이해할 수 있었다. 객체지향에서 역할, 책임, 협력이란 무엇인지 글을 통해 배울 수 있다.  더불어 객체의 특징을 통해 인생도 비유적으로 생각해 볼 수 있는 내용이었다.

 

<테스트-주도 개발>

테스트-주도 개발의 기본 흐름은 실패하는 테스트를 작성하고, 테스트를 통과하는 가장 간단한 코드를 작성한 후(이 시간 동안에는 중복이 있어도 무방하다), 리팩터링을 통해 중복을 제거하는 것이다. 

테스트-주도 개발은 테스트를 작성하는 것이 아니라 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성하는 것이다. 

테스트-주도 개발은 다양한 설계 경험과 패턴에 대한 지식이 없는 사람들의 경우에는 온전한 혜택을 누리기가 어렵다는 것이다. 

테스트-주도 개발은 객체지향에 대한 깊이 있는 지식을 요구한다. 

테스트-주도 개발은 책임-주도 설계의 기본 개념과 다양한 원칙과 프랙티스, 패턴을 종합적으로 이해하고 좋은 설계에 대한 감각과 경험을 길러야만 적용할 수 있는 설계 기법이다. 

 

<묻지 말고 시켜라>

객체를 자율적으로 만들고 캡슐화를 보장하며 결합도를 낮게 유지시켜 주기 때문에 설계를 유연하게 만든다.

객체가 자신이 수신할 메시지를 결정하게 하지 말고 메시지가 협력에 필요한 객체를 발견하게 해야 한다.

 

<책임의 자율성이 협력의 품질을 결정한다>

1. 자율적인 책임은 협력을 단순하게 만든다.

2. 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다. 

3. 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다. 

4. 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다. 

5. 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다. 

 

<개발자의 삶이 고단하면서 흥미로운 이유>

요구사항이 예측 불가능하게 변경되기 때문이다. 

훌륭한 설계자는 사용자가 만족할 수 있는 훌륭한 기능을 제공하는 동시에 예측 불가능한 요구사항 변경에 유연하게 대처할 수 있는 안정적인 구조를 제공하는 능력을 갖춰야 한다. 

안타깝게도 미래의 변경에 대비할 수는 있지만 미래의 변경을 예측할 수는 없다.

 

특히 마지막에 '커피 전문점'이라는 세상을 통해 도메인을 설계하는 방법은 객체를 이해하고 도메인 모델에서 최종 코드까지 구현 과정을 간략하게 설명하여 이해를 높일 수 있었다. 메시지가 객체를 결정한다는 말의 의미, 책임을 따라 설계가 이뤄지는 과정, 인터페이스와 구현의 분리와 같은 다양한 이슈에 대해 어렴풋하게나마 개념을 잡을 수 있다.

 

객체지향 세계에서는 모든 객체가 능동적이고 자율적인 존재다.