C 프로그래머를 위한 C++, 그리고 OOP 학습법?

sangwoo의 이미지

저는 주로 C를 사용하여 프로그래밍을 해온 대학원생입니다. 지금은 Computational Physics 를 공부하고 있지만, 예전에 산업기능요원으로 3년정도 회사에서 프로그래밍을 해온 경험이 있어서 C에 대한 내용은 대부분 숙지하고 있습니다. 주로 APUE에 있는 것과 같은 레벨의 프로그램을 만들었었습니다. FreeBSD 에서의 커널 프로그래밍도 조금 했구요.
요즘 들어서 (여러 가지 이유로) C++ 프로그램들을 많이 접하게 되는데요, 코드를 읽는 것은 그래도 좀 낫지만, 처음부터 코딩을 하려고 하니깐 많은 어려움에 봉착하게 됩니다. 일단 프로그램 구조를 어떻게 계획해야 하는지가 가장 부족한 거 같구요. Object-oriented 로 생각을 하는게 쉽지 않은 것 같습니다. 게다가 부가적인 문제이지만 코딩 컨벤션 (indent와 변수 이름, 함수 선언 형태 등등)을 어떻게 참고해야 할지도 모르겠구요.
제가 관련 전공자가 아니라서 그런지 기본적인 OOP에 대한 이해가 부족하기 때문인 것 같습니다. 어떻게 공부를 해 나가는게 가장 효율적일까요? 꼭 C++ 로 된 내용이 아니더라도, OOP를 공부하기 위해 읽을 만한 좋은 책들도 추천해주시면 감사하겠습니다.

codebank의 이미지

어떠한 정보이든 직접 고르는 것만큼 자신에게 도움되는 것은 없다고 생각합니다.
즉, 추천을 받은 책들이 자신에게 맞는 것일 수도 있지만 컴퓨터에 앉아서 주문하고
받아서보는 것보다는 직접 서점에서 자신에게 맞는 책을 고르는 것도 좋다고 생각합니다.

제가 추천 받은 책중에는 Java용 Object-oriented를 설명한 책이 있었는데 나름 괜찮았다고
생각합니다만 책제목은 생각이 안나네요.(집에 가면 있지만 지금은 외부라서...)

제가 C++을 공부한책은 'C프로그래머를 위한 C++'인가하는 책과 'Borland-C를 이용한
C++'인가하는 책이었습니다.
두권모두 아주 기초적인 그래서 C++의 세세한 부분까지는 아니지만 적당하게 사용할 수
있을 정도까지는 배울 수 있었던 책 같네요.
깊이 있는책은 Java언어를 사용한 책부분을 보시거나 OOP전용 책들을 참고하시는게 좋습니다.

마지막으로 직접 서점에 가보시라고 다시한번 말씀드리고 싶네요.
百聞이 不如一見이니까요. :-)
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

neogeo의 이미지

음 비슷한 글에 비슷한 댓글을 달았던 기억이 있군요.

언제나 제 대답은

1. 우선 C++에 대한 책을 자세히 공부. ( ex - The C++ Language ) 물론 꼭 어려운 책일 필요는 없습니다. 기초적인 문법과 용도 정도는 확실히 파악해야 하죠.

2. Effective C++ 와 GOF Design Pattern ( 필독서 입니다. )

3. STL ref. , More Effective C++ , Effective STL ( 셋다 보면 좋습니다. 꼭 다 보실필요는 없지만 STL 에 대한 공부를 하는 단계 + C++ 공부의 심화 과정 이라고 보시면 됩니다. )

4. Modern C++ Design ( 필독서 입니다. )

5. Exceptional C++ , More Exceptional C++

대략 저 정도가 제가 그동안 본 책중에 공부 순서와 내용을 통틀어 가장 괜찮다고 생각하는 책들 및 책의 순서 입니다.

이렇게 공부해도 정작 이 내용은 C++ 로 OOP 를 어떻게 하는가 와 프로그래밍을 하는가 정도에 대한 공부이지,

OOP 자체에 대한 공부는 더 많은 좋은길이 있을것입니다.

전 공감하지 않습니다만, 대부분 C++ 의 복잡성 때문에 OOP에 대한 진정한 시야가 가린다 라고들 합니다.

저정도 다 하고 나면, 보통 국내에선 C++ 의 고수의 반열에 올랐다고 생각 할 수 있을 것입니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

xyhan의 이미지

C++이라면.. 클래스와 상속 정도만.. 잘하면 되지 않을까요..

Address는 구조체에 자주나오는데.. Adress는 클래스에서 보면 속성일 뿐이죠..
편지, 엽서 이런 객체 안에 주소라는 속성으로써 들어가 있겠죠...
그리고.. 편지, 엽서는 보내고, 받고, 읽고, 버리고 같은 동작이 들어 갈수 있을 테구요..
이걸 C로 구현하면.. 편지,엽서라는 구조체가 있고..
보내고, 받고, 읽고, 버리고 같은 함수가 존재할 테고..

C++은 그냥 동작과, 변수가 클래스 안에 들어간다..
C는 함수와 구조체나 변수가 각각 절차적으로 물려서 돌아간다.. 정도..

개념으로 접근하려고 하면 전 너무 어렵던데요...
그리고 그 개념도 자바쪽에서 보면.. 약간 변화되어서..
상속의 개념이 패턴이나 프레임워크를 만드는데 일죠했죠..
물런 그것도 상속의 개념중에 있지만요.
============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

ssangkopi의 이미지

패러다임이란게 참 간단한 것이면서도 이해하지 못한 상황에서는 전혀 손에 잡히지가 않죠.

함수형이나 절차형 등등, 뭐 이런 개념도 다 이해하고 있는 상황에서 객체지향은 이런 개념이구나 하면 더 좋을텐데요.

객체지향을 이해하기 위해서라면 처음부터 C++ 같은 공룡같은 언어보다 스몰토크를 조금이라도 보시길 권합니다. 순수 객체지향(pure object-orientied) 언어를 한번 접해 보시는게 좋을 듯 합니다.

객체지향은 밑에 말을 자연스럽게 받아들일 정도면 거의 다 아는거라고 할 수 있죠.

객체지향의 힘은 다형성(polymorphism)에서 나온다.

이 말을 설계단계에서 응용할 수 있으면 어느 정도 객체지향을 알고 있다고 봐도 될 것 같네요.

greathj의 이미지

OOP에 관한 좋은 책들은 정말 많습니다. 윗 분들 께서 언급해주신 책들도 모두들 한번씩은 봄직한 교과서 같은 책들입니다. 요즘은 더 나아가 디자인 패턴, 애자일, ...... 정말 많은 책들이 나오지요. 이런 좋은 자료들을 바탕으로 OOP를 익히는 가장 좋은 방법은 '수파리(守破離)'라고 생각합니다. 저도 '테스트 주도 개발'이라는 책에서 알게된 용어입니다. '리'의 단계는 저같은 범인에게는 너무 먼 곳이지만 '수', '파'정도의 단계는 열심히 하다보면 깨달음이 생긴다고 봅니다. 전문용어로 흔히들 공력이라고 얘기하죠^^ 노력의 중요성에 대한 명언들을 굳이 꺼내지 않더라도 삽질과 연식으로 얻어진 공력의 무서움은 이 바닥에선 진리니까요^^

appler의 이미지

OOP 말은 멋지지만 말처럼 쉽지 않은

하나의 학문이라고 봐야 할까요?

저는 아직도 세상에 완벽한 OOP란건 없다고 보는데요..

왜냐면 말그대로죠 OOP의 의미를 풀어본다면요^_^


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

semmal의 이미지

쌍코피님 말씀처럼 스몰토크를 보시기를 권합니다.
------------------------------
How many legs does a dog have?

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

zeromire의 이미지

Head First Object Oriented Analysis & Design : 세상을 설계하는 객체지향 방법론

이런 책은 어떨까 싶습니다.
자바쪽에선 유명한 Head First 시리즈 중 하나입니다.

C++ 문법이나 JAVA 의 문법도 중요하지만
이러한 객체지향 분석에 대한 개념을 잡아주는 책도 괜찮지 않을까 싶습니다.

zeromire의 이미지

패턴 그리고 객체지향적 코딩의 법칙

객체지향 분석의 개념이 반 패턴이 반 정도 입니다.
객체지향의 개념이나 패턴에 대해서 편하게 잘 설명한 책이 아닌가 싶습니다.

김성진의 이미지

도 닦으신다고 생각하시고 어떤 책이라고 정독을 하시고 공부하시면 됩니다.

지름길도 없고, 골든 룰도 없습니다.

나중에 끝에 다다르시면 C나 C++나 그놈이 그놈이라는 것을 깨달으실 수 있을 겁니다.

그래서 저는 다시 C로 돌아왔습니다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

sangwoo의 이미지

답글 달아 주신 분들께 너무너무 감사드립니다. 큰 도움이 되었습니다!
말씀해주신 책 제목들은 모두 포스트잇에 적어서 책상에 붙여 두었구요..
다행히 책들 중에 하나를 갖고 있어서 그것부터 조금씩 읽어 볼까 합니다.
역시나 요령피우지 말고 열심히 읽고 열심히 짜는 게 길인 것 같습니다. :-)
----
Let's shut up and code.

----
Let's shut up and code.

soungno의 이미지

제가 나설 만큼 출중한 실력을 겸비하고 있지 못하지만
전산이라는 밥을 8년 정도 먹고 살며서 OOP에 대해서 느낀 것은 우리가 익히 어릴적에 공부한 것이라는 것 입니다.
인간은 사물을 객체로 인지 한다고 하지요, 즉 우리가 사물을 느낄수 있을때 부터 객체의 개념은 가지고 있는 것이지요
그럼 OOP가 왜그리 어려운가? 제 생각에 살며서 너무 많이 배워서 그런것 같습니다.
OOP적 분석,설계 및 구현을 할때 이미 내 뇌속에서는 Java의 문법 클래스 c++의 상속등 온갖 잡다한 것들로 가득 차 버리지요
그러다 보니 실제 구현한 클래스는 하나의 객체화를 했다기 보다는 기능상으로 나눠져 버린 프로그램 처럼 되어 버리고 전체 애플리케이션은 복잡해 지기 시작 하죠
그냥 모든것을 잊고 요구사항을 객체로 분석 설계 해 나간다면 훨씬 쉽게 oop 프로그램을 개발 하지 않을까 하는 생각 입니다.

잘 가야지.

sugarlessgirl의 이미지

갠적으로 C프로그래머가 C++로 넘어가는데 가장 큰 걸림될이 된다고 생각되는것은
객체지향적 설계로 인해서 생기는 오버헤드를 경험있는 C 프로그래머들이 납득하기 어렵다는 거라는 생각이 듭니다.
머 철저히 개인적인 경험에서 나온 주관적인 의견입니다만... -_-;

함수 하나로 때려박아 버리면 땡~ 하고 끝날일이 (하긴 이건 C 에서도 바람직하건 아니지만요..)

객체지향적 설계한답시고.. 클래스로 쪼개고.. 상속계층 생기고..
클래스 생성했다 해제하고.. 메모리관리 골치아프고.. 클래스들끼리 데이터 넘기고 받고.. 등등..

애초에 자바나, Python 같은 녀석들이라면 애초에 속도는 어느정도 접고 들어가는거니까-_-
하지만 C++ 라면 더구나.. C프로그래머였다면.. 아 이렇게까지 해야하남..? 하는 유혹이 생기죠.. -_- (본인이 그랬음-_-; )

본인의 한계로 설계의 유연함이나 재사용성에 대해서는 그닥 이익을 본적이 없지만..
일단 코드가 깔끔해지니 좋긴 하더군요.. -_-;;

결론은.. 객체지향을 익히는데.. 디자인 패턴을 공부하는게 제일 좋은거 같구요..
Java의 JFC나 맥의 Cocoa 같은 잘 만들어진 객체지향 프레임워크를 공부하는것도 큰 도움이 되었습니다.

paeksj98의 이미지

c만하다가 시작하려니 힘드네요...
저도 윗분들 조언좀 참고 해야겠습니다.