OOP (객체 지향 프로그래밍) 프로그래밍 실습용 좋은 책 추천 부탁드립니다.

hyde1004의 이미지

안녕하세요.

저는 개발 9년차 임베디드 개발자입니다.
저희 쪽은 아직 C로 구현하는 경우가 많고, 일부 모듈은 C++로 구성되어 있습니다.

최근에 Architecture 교육을 듣게 되었는데, 객체 지향 관련 내용이 많았습니다.
학부생일때 C++을 공부하기도 했었고, 석사과정에는 MFC로 프로그래밍 경험도 있어서,
OOP의 문법자체는 낯설지 않았습니다만, OOP 관점에서 설계 및 사고하는 것은 쉽지 않더군요.
신선한 충격이기도 했구요.
(예를 들면, 아무 생각없이 클래스의 멤버 변수를 private으로 하고,
public으로 getter, setter 함수를 만들었었는데, 이런 것도 문제가 된다고는 생각지도 못했거든요.)

어떤 문제를 OOP 관점에서 설계를 해보려 했으나
기존의 구조적 절차 언어적인 사고로 오랜 시간 프로그래밍을 한 탓인지, 아직 어렵기만 합니다.
클래스에 위임한다는 개념은 감이 오는데,
실제 어떤 식으로 클래스를 나누어야 하는지는 잘 모르겠습니다.

도움을 받고자 객체지향이나 디자인 패턴 관련 책을 몇 권 보았습니다만,
주로 패턴에 대한 설명이라서 좀 막연하기도 하고, 어떤 문제점을 해결할 때 좀 더 도움이 될 것 같습니다.

기존 절차적 프로그래밍에서 OOP적으로 바꿔보려 하는데, 도움이 될 만한 책이 있을까요?
실제 예제를 통해 조금씩 접근하는 방법이면 좋겠고, 가능하면 Java 위주면 더 좋을 것 같습니다.
(OOP 문법이 아닌, 패러다임을 이해할 수 있는 책으로 부탁드리겠습니다.)

감사합니다.

semmal의 이미지

저는 책보다는 squeak을 써보시는걸 추천해봅니다.
smalltalk 언어고, squeak 자체가 OO 패러다임으로 작성된 것이라, OO를 안쓰고 프로그래밍할 방법이 없습니다.
어쩔 수 없이라도 OOP가 익혀질거라고 생각합니다.

------------------------------
How many legs does a dog have?

jeongheumjo의 이미지

헤드퍼스트 디자인패턴
추천합니다. 입문서로 아주 좋은 것 같아요.. Java, C++ 둘 다의 좋은 예제가 실행가능하게 제공됩니다. 두 개 언어중 하나에 관심 있거나 둘 다 관심있는 경우에도 무리없이 읽을 수 있더라구요..

http://opencpp.kr/Books/programming_hfdp.html

제가 이 책을 읽고 정리를 좀 해봤습니다.

lazycoder의 이미지

해당 업무의 도메인 지식이 충분한다는 가정하에서
초보자용 UML 책에서 클래스 다이어그램 부분만 보셔도 큰 도움이 될듯 한데..
uml distiled란 책이 괜찮습니다. 번역서로도 있구요. 저는 늘 옆에 두고있는 책중에 하나입니다.
그리고 설계원칙이란게 있습니다. 그건 jeongheumjo님이 소개하신 책으로 접하시면 될 듯 하구요.

원론적으로 접근하는 책에는 보통 Addison Wesley쪽에서 출간된 책들을 많이들 권하시는데
저는 http://www.amazon.com/Object-Oriented-Analysis-Design-James-Martin/dp/0136302459/ref=sr_1_1?s=books&ie=UTF8&qid=1307793027&sr=1-1
이 책을 선택했었습니다. 실제로 서점가서 하루종일 비교하면서 읽어보다가 선택한 책인데.. 저한테는 맞더라구요. (UML로 접근하지 않아서 좋습니다. 물론 그게 단점이기도 하구요..)

설계전에 분석부터 OO적으로 접근해야 하기때문에 제가 소개한 책이 아니더라도 설계분석 책중에 꼭 한권쯤은 읽으시길 추천합니다.

unsouled의 이미지

헤드퍼스트 OOAD 추천합니다.

이한길의 이미지

개인적으로는 Swing을 사용한 자바 GUI 프로그래밍도 좋다고 생각합니다. 사실 객체지향이라는 것이 컴퓨터의 모든 상황과 딱 들어맞는 것은 아닙니다. 그런데 GUI부분에 있어서는 정말 잘 맞고, Swing은 그것을 잘 구현해 놓았다고 생각합니다.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

익명 사용자의 이미지

와 소름끼쳤어요.
일주일전에 "OOP적으로 생각하라"였던가? 그런 책을 샀어요.
JAVA랑 C++등등 다양한 언어로 예제를 제공하는데
대체로 JAVA가 많고, 문법이나 그런것보다
패러다임에 대한 내용을 주로 다루고 있어요.

UML이라던지 다양한 수단으로 설명을 하지만,
특정 언어나 수단을 몰라도 이해할 수 있게 설명하고 있습니다.
저도 최근에서야 머릿속에 벼락치는 느낌을 받았는데
아직 못찾았다면, 이 책이 꼭 도움이 됐으면 좋겠네요.

yielding의 이미지

저 역시 semmal님의 의견에 100% 공감합니다. 책보다는 OOPL으로 프로그래밍 하기.
사족을 달자면, smalltalk 혹은 squeak, ruby, objective-C 등의 dynamic-OOPL을 공부하는 것이 좋은 이유가 message passing 정확히 이해하는데 도움이 되기 때문입니다. 또한 이러한 언어의 대부분은 모든 것이 객체입니다.
참고로, "Hello World"를 열 번 출력하는 단순한 프로그램을 ruby로 짜면

 10.times { puts "hello world" }

배열에 있는 모든 원소의 합을 구하는 프로그램은
array  = [1, 2, 3, 4, 5, 6, 7, 8,  9, 10]
sum = array.reduce(0) { |sum, element| sum + element }

혹은 더 간결하게
array  = [*1..10]
sum = array.reduce(0, :+)

로 표현 가능합니다. 아름답지 않습니까? 두 예제가 객체와 message passing으로 잘 설명되는 좋은 예제라 할 수 있겠습니다.

OO에서 가장 중요한 아이디어가 무엇이냐는 질문에 C++, Java에 익숙한 많은 사람들은 class, interface 기반의 inheritance 혹은 polymorphism을 생각을 하지만 정작 smalltalk을 만든 Alan Kay는 message passing이라고 자신의 의견을 피력한 바가 있습니다. 한 헛똑똑이 컨설턴트가 유즈넷인가 메일에서 Alan Kay의 이러한 생각을 맹렬히 비판했는데 열받은 Alan Kay가 '내가 객체지향을 만든 장본인' 이라고 밝힌 재미있는 일화가 있습니다. (참고로, Alan Kay의 학부 전공이 생물학이고 세포가 message를 주고받으면서 통신하는 것에서 아이디어를 얻어 smalltalk을 설계했습니다.)

> 어떤 문제를 OOP 관점에서 설계를 해보려 했으나
> 기존의 구조적 절차 언어적인 사고로 오랜 시간 프로그래밍을 한 탓인지, 아직 어렵기만 합니다.
> 클래스에 위임한다는 개념은 감이 오는데,
> 실제 어떤 식으로 클래스를 나누어야 하는지는 잘 모르겠습니다.

흠. 오랫동안 OOPL을 사용해서 OOP를 해온 사람들에게도 여전히 힘든 주제일 것입니다. 아마도 컴퓨터 사이언스의 근본적인 난제 중 하나일 겁니다. 절차적 언어를 이용해 프로그램 만드실때도 동일하게 변수, 함수 이름을 어떻게 만들 것인지, 모듈을 어떻게 묶어 낼 것인지 어렵지 않으시던가요? 그래서, 프로그래밍이 여전히 공학이 아니라 Art가 아닐까하는 생각을 해봅니다.

Life rushes on, we are distracted