C++ 프로그래밍을 한다는게 뭘까요?
글쓴이: gurugio / 작성시간: 목, 2005/01/13 - 12:51오전
(게시판 성격에 맞지 않다면 옮겨주시거나 말씀해주시면 옮기겠습니다.)
요즘 연구실 과제로 QT 프로그래밍을 하고 있습니다.
QT는 분명 C++ 기반으로 제공되는 라이브러리인데요
책에 있는 예제 소스들은 클래스를 사용한다는 것을 제외하고는
보통 C 프로그래밍과 다른게 많지 않아보입니다.
가끔 C++에 관한 글들을 보면 제너릭 프로그래밍이나
STL이나 굉장히 어렵고 복잡할것 같은 단어들과 개념들이
난무 wink 하더라구요..
한달정도 후면 과제에서 코딩 작업이 시작되는데요
일만줄 이하정도의 작은 프로젝트를
C++답게 객체지향적으로 하려면
어떤 개념들과 어떤 마인드를 가져야 할지
선배 개발자님들게서 소개라도 해주시면 큰 도움이 될것 같습니다.
Forums:
Gtk로 오세요~~~슝슝~~~~
Gtk로 오세요~~~
슝슝~~~~
인생이란게 다 그런게 아니겠어요....? 뭘(?)
http://schutepen.egloos.com
제가 알기론 Qt는 GUI말고 자체적으로 QString 같은 비 GUI
제가 알기론 Qt는 GUI말고 자체적으로 QString 같은 비 GUI library를 가지고 있고 그 안에서 해결합니다. C++의 library들 -- STL -- 같은 것이 정착되기 전부터 개발되어서 그런 것으로 알고 있구요. 뭐 STL 같은 것들과 같이 쓸 수 있지만 관리의 용이성들에서 그냥 Qt가 제공하는 library 쓰는 것이 권장되겠지요.
그리고 GUI 프로그래밍은 OOP가 적용되기 가장 좋은 예로 알고 있습니다. 위젯끼리 부모 - 자식 삼지요. ㅋㅋ
It's better to burn out than to fade away. -- Kurt Cobain.
C++프로그래밍!=객체지향 프로그래밍 이란걸 염두에 둬야 할것 같네요.
C++프로그래밍!=객체지향 프로그래밍 이란걸 염두에 둬야 할것 같네요. C++프로그래밍은 객체지향 패러다임을 포함하므로 더 크다고 얘기해야겠죠. C++프로그래밍 > 객체지향 프로그래밍 이렇게 되겠네요. 원래 이 괴물같은 랭귀지가 지향하는것이 멀티 패러다임인만큼 그 '의도'를 잘 살려 생각해주는것이 필요하겠습니다. :lol:
그리고 제너릭 프로그래밍은 객체지향과는 궤를 달리하는 별도의 패러다임이라고 보셔야 합니다. 물론 그것의 구현물인 STL을 사용하는건 또 다른 문제가 됩니다. (STL은 얼마든지 객체지향적으로 사용하실 수 있습니다.)
어쨋든 원하시는건 C++답게가 아니라 객체지향답게 프로그래밍하는 방법정도가 될것 같은데 이에 대해선 이미 많은 글들이 얘기되었을것으로 생각하고 생략하죠...라고 넘어가면 너무 섭할테니까 :o 그냥 한마디만 하면, 객체라는 말에 얽매이지 말고 각 객체간 "역할과 책임"을 분할하고 합치는데 많이 신경을 쓰시라는 말씀을 드리고 싶군요. 열심히 하시기 바랍니다. :wink:
Qt 프로그래밍이라면 Qt 라이브러리에서 제공하는 클래스를 이용하여 프로
Qt 프로그래밍이라면 Qt 라이브러리에서 제공하는 클래스를 이용하여 프로그래밍을
한다는 뜻으로 보입니다. GUI가 OOP에 적합하다는 것은 잘 알려진 사실이지만,
보통 이런 것들은 프레임웍이 이미 짜여져 있기 때문에 이것을 이용하는 입장에서는
OOP에 대한 이해가 별로 필요하지 않은 것도 사실입니다. MFC 프로그래밍도
이와 비슷하죠. 그저 매뉴얼에서 하라는 대로 적당하게 끼워넣기만 하면 되는 겁니다.
이 경우에는 OOP보다도 수많은 클래스와 함수들을 언제 어떻게 써먹느냐에 대한
지식이 훨씬 유용합니다.
비유를 하자면 PC를 조립하는 사람은 회로 설계나 CPU의 동작 원리에 대해서는
알 필요도 없고 단지 어떻게 끼우고 조이는가만 알면 되는 것과 마찬가지입니다.
이와는 별도로 Qt를 특정 목적에 맞게 커스터마이징하는 일이라면 OOP에 대한
기본적인 이해는 필요하겠죠. 그럴려면 어떻게 해야 하느냐고 물으신다면 너무
추상적이고 광범위한 질문이 됩니다. 좋은 책과 코드를 참조하면서 연마하시라고
할 수밖에는... :)
Re: C++ 프로그래밍을 한다는게 뭘까요?
간단한 문제일 경우에만 그런것 같습니다.
실제 QT로 프로그래밍을 하다보면, 재 사용성을 위해서
여러가지 C++답게 사용해야할 부분이 많이 있습니다.
또한, 기존 작성된 QT Widget들을 상속받아서 새롭게
재구성하는 과정에 있어서도 C++ 을 이애하는것이 필수가 됩니다.
QT개발자가 늘어가는것 같아서 기분이 너무 좋네요^^
QT 컴뮤니티도 한번 들려주심이 :D
http://www.korone.net QT 커뮤니티 사이트
c++도..
C++ 책을 보면 간단한 예제들이 별로 객체지향 적으로 보이지 않는다고 생각하시는분들이 많이 있을겁니다.
도데체 struct 에 함수를 묶어놓은거 말고 무슨 차이냐는 분들도 있을수 있지요.
그렇게 보면 C랑 별반 다를게 없어보이지만..
C++을 사용한다는것은 프로그램을 만들때 보다 쉽게 객체라는 개념을 도입해서 프로그램을 만들수 있다는것을 의미한다고 봅니다.
물론 C로도 비슷하게 객체지향적으로 구현할순 있지요..
그렇지만 예를 들어 private 멤버 펑션을 호출하지 못하도록 하는 의미를 부여하는것은..
C++에서는 컴파일러가 관리를 해주지만 C에 프로그래머가 직접 기억해 두었다가 관리를 해야 하는거겠죠?
함수명이 같은 2개의 method가 있을때 C++은 자동으로 바인딩 해주지만.. C는 그런기능이 없으므로 prefix 등을 이용해야 합니다.
또한 C에서 하나의 객체라는 개념을 이용할려면 제일 편한것이 struct 인데 이 struct에 속한 method를 정의하려면 struct안에 함수 포인터를 이용하여 struct에 그 함수의 포인터를 항당해야 합니다.
그런 과정을 c++은 기본으로 지원하는것이지요.
또한 소스레벨에서 class라는 개념으로 묶여 있으니까.. 어느 함수가 어느 class에 속한것인지도 보기 쉬워지고.
당연히 c++ 이 더 보기 쉽고 프로그램하기 편하겠죠? ^^
정리하지면 C++은 객체라는 개념을 언어차원에서 지원함으로써 사용자가 객체라는 개념을 도입하여 프로그래밍을 좀더 쉽게 하고 관리할수 있도록 하기 위한 툴임으로 C++로 프로그래밍 한다는것은 그걸 이용하여 쉽게 프로그래밍 하고 관리하고 유지보수 하겠다는 의미라고 생각합니다^^
Hyo-Sung Lee(李曉星/Mark Lee)
KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer
Re: c++도..
마인드를 변화 시킨다는 것이 어려운지, 아니면 개념이 제대로 안 서는 것인지. 저에게 객체지향은 참으로 어렵습니다. 왜 그렇게도 구현하기가 어려운지. 자동차에 비유하는 객체지향의 개념은 이상하게도 이해 한 것 같은데 실제로는 적용이 안되더군요.
갑자기 무슨 도구를 갖다 주어도 객체지향 대신에 프로지저 중심으로 되어 버립니다.
저와 같은 굳은 머리는 어떻게 해야 새로운 개념을 받아 들여서 저의 것으로 만들 수가 있을지 막막하군요. 저보다 더 머리가 굳은 보스는 답만 내면 되지, 중요한 것에 더욱 집중을 하라는데, 저는 아직 젊은 관계로 궁금증도 많거든요.
누가 이런 것들을 정리해서 올려주실 날만 기다리고 있습니다. (창피해서 면목이 없습니다.) :oops:
"책에 나온 예제들이 나빠요." "선생도 나빠요." 자바하고 씨 한다고 갔더니 씨의 문법을 자바로 직역하는 판이니.
==========================
부양가족은 많은데, 시절은 왜 이리 꿀꿀할까요?
=====================
"지금하는 일을 꼭 완수하자."
[quote]마인드를 변화 시킨다는 것이 어려운지, 아니면 개념이 제대로
"디자인 패턴" 을 공부해보셨는지요. 객체 지향 언어를 사용하는 것과 객체 지향 개념을 사용하는 것은 차이가 있습니다. 그냥 코드만 들여다 봐서는 그 코드가 지향하는 철학과 개념을 찾기 어렵습니다. 이미 고수라면 모를까 초보가 "소스 코드"만 가지고서 공부하기는 어렵지요. 잘 된 소스 코드를 만들어내는 것은 물론 훨씬 어렵구요. 보다 추상적으로 구조와 개념을 알려주는 도우미가 있어야 합니다. 축구 규칙과 포지션, 전술을 알고 있는 사람은 운동장을 뛰어다니는 선수들의 움직임에서 의미와 패턴을 읽지만 모르는 사람은 그냥 어지럽게 뛰어다니는 사람들만 보일 뿐입니다.
디자인 패턴이 포지션,전술 개념과 실제 선수들의 움직임. 실제 소스 코드와 객체 지향 개념, 설계의 간극을 매워줄겁니다.
객체를 찾아내는 기준은 다양하다고 생각하는데요. 예를 들어 respons
객체를 찾아내는 기준은 다양하다고 생각하는데요. 예를 들어 responsibility를 중심으로 객체를 설계할 수 있겟죠.
제가 가장 편하게 생각하는 객체 설계 방법은 행위(behavior or method)를 중심으로 시작하는건데요. 예를 들어 c++을 c처럼 쓰면서 함수 하나를 만듭니당
이제 함수 하나가 더 필요해졌다고 가정하죠.
두 함수(behavior)를 보니 같은 데이터(string me)를 조작하네요.
이제 같은 데이터를 조작하는 함수들을 하나로 합칩니다.
이제 중복을 제거합니다.
위 코드는 아주 단순한 문제고 정답은 모르겠습니다. 그냥 지금 제 능력으로 쉽게 시작할 수 있는 방법일 뿐이죠. 코드가 늘다보면 객체를 잘 유도해 낼 수 있는 방법(SRP,..., LOD, GRASP, DP, 또는 TDD등등)을 심도있게 학습할 필요가 있다고 생각합니다.
조금이나마 도움이 되셨기를...
Re: c++도..
제 생각에 C++이나 자바로된 프로젝트를 하나 분석하시는것도 좋은 방법이라고 생각됩니다. 자바는 C++보다 클래스를 구현하는 방법이 좀더 간략하고 편리하니까 좀더 용이 합니다.
그리고 위에 분이 말씀하셨던 디자인패턴이라는것을 보시면 아주 많이 도움이 됩니다. 디자인패턴이라는것이. 객체를 어떤식으로 구성할것인가? 를 말하는것입니다.
일반적으로 C++책은 C++이라는 언어를 중심으로 나와 있지 그것을 어떻게 활용하여 객체를 만드는가에 대한 내용은 없습니다.
가장 쉬운 예로 virtual 함수에 대해 나와 있긴 하지만 실제 프로젝트에서 이를 어떻게 응용해서 사용하는지에 대한 내용은 없는거죠^^ 자바로 따지면 인터페이스 클래스 입니다.
A라는 CLASS는 인간입니다.
B라는 CLASS는 동물입니다.
따라서 A와 B클래스 내부 구현은 완전히 틀립니다.
그런데 C라는 클래스는 A나 B를 입력 받아서 이름, 나이, 성별을 데이타 베이스에 넣는다고 가정해 볼때
C는 인간을 입력받는 함수와 동물을 입력받는 함수 2개를 만들수도 있지만..
A B 클래스에서 이름,나이,성별을 끄집어내는 Vitual 클래스 X를 상위 클래스에 놓아준다면.. C클래스는 하나의 메소드에서 이름,나이 성별을 가져 올수 있게 됩니다. 왜냐구요? C++을 하셨으면 알겠지만 vurtual 을 상속받게 되면 하위에서는 꼭 구현을 해야 합니다. 그리고 클래스C에서 ClassX만 입력 받겠다고 하면 클래스 A B는 클래스 X를 상속받을수 밖게 없겠죠^^ 따라서 이름,나이,성별을 리턴하는 코드를 구현할수 밖에 없는거구요..
Class X <-- Virtual
Class A Class B
즉.. ClassX가 상위에서 인터페이스 역활을 해주고
ClassC 는 ClassA와 ClassB를 입력 받을때 모두 ClassX로 보고 입력을 받는거죠.^^
더 복잡하다고 생각할지 모르겠지만. C가 A나 B랑 이야기 할때의 인터페이스가 Class X로 일원화 되었기때문에 사실상 개념상으로는 더 알기 쉬워진겁니다. Class C은.. 이제 ClassX의 인터페이스를 상속받은 어떠한 클래스(외계인이건 기계건 미생물이건) 함수의 추가 없이.. 입력 받을수 있게 되는거죠.. Class C는. 입력을 ClassX로 제한함으로써 Class C에 입력을 주고 싶은 어떠한 것들이던지 ClassX만 구현하면 된다는게 되는거구요
이게 C 언어 였다면 Class C는 아마 입력받는 놈이 추가 될때마다 새로운 펑션을 코딩해 줘야 했을겁니다^^;
어느게 더 편하다고 생각하십니까? 자꾸만 객체 단위로 생각하는 버릇을 들이시는게 좋습니다.
암튼 그래서 디자인패턴을 꼭 보셔야 하고 여러가지 프로젝트 소스를 보셔야 한다는 말을 하고싶었습니다.
Hyo-Sung Lee(李曉星/Mark Lee)
KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer
STL이 어렵다는데 그걸 사용하지 않고 하는 방법이 더 어려울것 같습니다
STL이 어렵다는데 그걸 사용하지 않고 하는 방법이 더 어려울것 같습니다.
중언부언일수도 있지만, 위에 적힌 객체 지향에 대한 글을 좀 쉽게 풀어쓰
중언부언일수도 있지만, 위에 적힌 객체 지향에 대한 글을 좀 쉽게 풀어쓰면 이렇게죠.
"고객이 돈을 주고 물건을 산다"라는 문제를 코딩을 한다고 칩시다.
절차적 또는 구조적 프로그램에서는 Buy라는 프로그램에 돈을 주는 함수와 물건을 받는 함수를 만들고, 돈과 물건이 변수로 정의가 되겠죠.
객체 지향에서는, 우선 문제에 주어진 고객, 돈 그리고 물건이라는 대상을 먼저 구분을 하고, Customer라는 클래스에 돈을 주는 method와 물건을 받는 method를 만들게 됩니다.
변수로 처리되던 돈과 물건이 객체로 가시화된 것을 제외하고는 여기까지는 별반 차이가 없어보이죠.
위의 문제에 물건이 없어서 돈은 선불하고 물건을 나중에 받게끔 예약을 하는 문제가 추가가 되었다고 합시다.
절차적인 방법에서는 대개의 경우는 Buy 프로그램 날짜라는 변수를 만들고 어디다 그 정보를 저장하는 함수를 만들어 처리를 하겠지만 예약이라는 것을 구현이 된거인가 아닌가가 불분명합니다.
반대로, 객체 지향에서는, AdvancedOrder라는 클래스를 만들고 예약날짜와 고객, 물건 그리고 받은 돈에 대한 정보를 각각의 클래스에서 끌어다 쓰겠죠. 분명한 대상이 있기 때문에 (단지 프로그램 내의 변수로 처리된 것과는 달리), 이렇듯 기존의 문제에 다른 문제가 추가 되었을 때, 비교적 확장이 용이합니다.
여기에, 단체 주문이라는 새로운 문제가 생기면 어떻게 되겠습니다. Buy 프로그램의 물건을 배열로 받는 함수를 확장을 한다고 해도 개인 고객인가 단체 고객인가에 대한 정보를 갖기는 힘듭니다. 그런데, 객체 지향에서는 Customer 클래스를 상속받는 IndividualCustomer와 GroupCustomer라는 서브 클래스를 만들면 기존의 돈을 주고 물건을 받는 함수는 손댈 필요가 없겠죠. 이렇듯 다른 속성을 가지는 객체를 상속으로 구현을 하는 것으로 문제를 해결할 수 있겠죠.
쉽게 설명을 한다고 했어도 길어졌는데, 요점은 프로그램을 코딩하는 것은 문제를 해결하고자 함이고, 객체 지향에서는 일상의 문제를 비교적 그대로 대상을 표현할 수 있다는 장점이 있습니다. 이 장점을 바탕으로 상속과 확장이 용이하다는 또다른 장점도 있고요. 모든 문제를 객체 지향으로 해결하는 것이 좋다고는 못해도 개념을 이렇게 잡고 시작을 하시면 될 듯 합니다.
그리고, 디자인 패턴은 결국 비슷한 문제들을 해결하는 방법은 정형화 시켜 놓은 것이니 객체에 대한 개념이 머리 속에 그려져서 코딩을 할 때쯤 해서 들여다 보아도 늦지는 않습니다. 이해가 선행되지 않으면 선무당이 사람잡는 꼴이 될 수 있다는 anti-디자인 패턴도 있다는 노파심에 사족을 답니다.
----
I paint objects as I think them, not as I see them.
atie's minipage
흠냐
C++답게 객체지향적으로 라는 말은 상당히 난감합니다.
이를 해결하기 위해 여러가지 경우를 염두에 둘 수 있겠는데요.
첫째, 높은 수준의 객체지향 프로그래밍을 사용하려고 하는 경우, C++의 객체지향 요소는 상당히 난해하고 복잡하면서 불완전합니다. 때문에 C++의 객체지향 프로그래밍은 거의 해킹을 방불케합니다. 이건 수년동안 수많은 시행착오를 겪지 않고는 결코 얻을 수 없는 스킬입니다. 이것에는 왕도가 없습니다.
둘째, 객체지향 프로그래밍할 때, C++에서 불완전한 기능을 배제하고 사용하는 경우에는 어느정도까지는(즉, 대부분의 사람들이 이해하고 있는 수준까지는) 사용할 수 있습니다. 그러나 본격적인 객체지향적 프로그래밍은 첫번째의 경우처럼 엄청난 경험을 쌓지 않는 다음에야 거의 불가능 하다고 보시면 됩니다. 즉, 아주 일부분의 도움을 얻을 수 있을 뿐입니다만, 소규모 프로젝트의 경우 대부분 이것만으로도 더 쉽고 간단한 프로그래밍을 할 수 있는 경우도 많습니다.
셋째, 과연 객체지향 프로그래밍을 써야하는가에 대해 생각해봐야 합니다. 프로그래밍을 하다보면 대부분 흔히 알고있는 객체지향 만능주의는 절대 일어나지 않습니다. 객체지향은 프로그래밍을 하는 여러 기법중의 하나일뿐이지 결코 모든 방법의 해결책이 될 수는 없습니다. 대부분의 경우 충분히 함수들이 쪼개져 있다면, 단순한 모듈화 방식만으로도 대규모 프로그램을 짜는 것이 어렵지 않습니다.
결국 결론은 객체지향을 처음 공부하시는 입장이라면 C++에서 객체지향을 쓰는 것은 아주 특정한 부분(즉, 객체지향을 쓰면 아주 유리해지는 상황, 예를들어 서브타입 다형성을 사용할 수 있는 경우)에서만 사용하라는 겁니다. Smalltalk에서 가능했던 수많은 객체지향적 프로그래밍 기법은 객체지향이 typed 언어로 넘어오면서 일부분만은 남기고 대부분 상실했습니다. 어떤 부분(어쩌면 대부분)에 대해서는 객체지향은 독이라고 보셔도 무방합니다.
또한 객체지향을 공부하시면서 디자인 패턴을 공부하실 필요는 없습니다. 디자인 패턴은 객체지향 프로그래밍의 경험이 많이 쌓인 다음에 보는 것이 오히려 좋습니다. 몇 가지를 제외하고 대부분의 디자인 패턴은 정석적인 프로그래밍 방법이라기 보다는 tricky한 스킬을 쓰기때문에, 오히려 객체지향 형태의 문제 해결방식을 공부하는데에 악영향을 줄 수 있습니다. 디자인 패턴은 위에서 말한 첫번째 경우 처럼 C++에서 거의 불가능한 객체지향 요소를 구현해보려는 욕심입니다. 그렇기 때문에, 객체지향을 완벽하게 이해하고 디자인 패턴을 자유자재로 변경할 수준이 아니라면 억지로 보는 것은 피하는게 좋습니다. 그러나 옆에서 생각을 바로잡아줄 수 있는 누군가의 도움이 있다면 고려해보는 것도 좋습니다.
객체지향 공부를 하기에 앞서 Theory of Object라는 책(물론 원서)을 읽어보기를 권합니다. 책을 사실 필요는 없고, 인터넷에서 구하시든 아는 사람을 통해 구하시든 책을 구해서 딱 1장만 읽어보세요. 2장부터는 논리적인 문제라 전문가들도 읽어봐야 이해못하구요. 1장만 읽어보셔도 객체지향이라는 놈이 어떤 어떤 놈이 있는가? 객체지향의 문제점은 무엇인가? 그러한 객체지향 문제점의 해결책은 무엇인가?에 대해 알 수 있습니다.
그리고 개인적으로 Java를 공부하기를 추천합니다. Java가 좋으니깐 어플리케이션을 만들어라~ 이런 말이 아니고, 객체지향을 공부하는데 만큼은 C++보다 Java가 좋습니다. 일단 C와 문법이 유사해서 배우기가 좋고, 좀 더(아주 약간 더) 객체지향적이기 때문에 도움이 되실 겁니다. 객체지향을 공부하는데 더 좋은 또 다른 언어를 추천하자면, python(이놈은 클래스 상속이 아니라 오브젝트 상속을 사용하는 특이한 객체지향언어), ruby(전통적인 방식의 클래스 상속 언어)나 Eiffel(Design by Contract라는 기법이 돋보이는 언어), sather(표준적이고 거의 완벽한 객체지향을 보여주는 언어)등이 있습니다.