객체지향 언어에대한 개념 질문입니다.

익명 사용자의 이미지

프로그래밍을 C로 시작한 초짜입니다.

클래스,메서드,인스턴스,객체 등등

개념 이해가 전혀 안되고 있습니다.

인터넷이나 책을 보면, "아 이런거구나" 하면서도

계속 읽다보면 C의 개념이 머리에 밖혀서인지 햇갈려 죽겠습니다.

처음에 '함수==클래스' 인줄 알았습니다.

'함수 != 클래스'라는 것을 알고는 '함수 == 메서드'인것 같다???????????!@$#@%@%^&#&

뭐 이런 식입니다.

누가 좀 속 시원히 개념 정리 해주실분 있으신가요??

jeongheumjo의 이미지

C를 하셨으니까 C++ 로 들어가신다고 가정하면,

1. 우선 윤성우씨의 "열혈강의 C++" 와 같은 C++ 문법책을 한권 보셔요.
2. 그리고는 STL을 공부하시고요.
3. 그 후에는 "헤드퍼스트 디자인패턴" 이라는 디자인패턴 책을 한권 보십시오.

저도 이렇게 하는데 시간이 몇년이 걸렸네요. ㅎㅎ 왜냐면 C++ 쓸 일 별로 없었거든요.
보통 1단계에서 C++ 다배웠다고 생각하기 십상입니다. 하지만 C++을 제대로 알기 위해서는 3단계까지 공부해봐야 하더군요.. 그 후에나 C++이 좀 자유로워질겁니다.

익명 사용자의 이미지

c++ 은 멀티 패러다임이 가능한 언어이다 보니, 초반에 공부할 때 객체지향 개념잡기가 어려웠던 기억이 있습니다.

java 로 간단한 문법과 패턴 공부를 해보시는 것도 객체지향의 이해에는 도움이 되지 않을까 싶네요.

익명 사용자의 이미지

분명 객체지향적 개념은 언어 발전에 따라서 나타난 패러다임 이더군요

프로그래밍 경력이 오래 되지는 않았지만 지금 많이 느끼고 있습니다.

저도 C++ 보다는 JAVA가 더 배우기 쉽지 않나 생각해 봅니다.

snowall의 이미지

예를 들어, "animal"이라는 클래스를 생각해 보죠.

"animal"클래스는 프로퍼티로 이런것들을 가집니다. eye, nose, mouth, ...

"animal"클래스는 메소드로 이런것들을 가집니다. run, walk, eat, ...

"animal"클래스로부터 상속받아서 "cat"클래스를 만들 수 있습니다. 만약, "animal"클래스의 "run"메소드가 구현이 안되어 있다면, "cat"클래스에서는 실제로 run을 구현해야 합니다. 그럼 animal에서는 run이 가상함수로 선언되어 있다고 합니다.

"cat"클래스의 인스턴스로 "cat1"같은게 있을 수 있습니다. 가령 cat cat1 = new cat; 같은 식으로 선언해볼 수 있겠죠.

cat1을 선언할 때 항상 cat.cat()메소드를 호출한다면 cat안에 구현된 cat()메소드는 생성자입니다.

cat1을 그만 쓸 때 항상 cat.~cat()메소드를 호출한다면 ~cat()메소드는 소멸자입니다.

프로퍼티가 될 수 있는 것들은 변수나 클래스의 인스턴스가 될 수 있죠.

메소드가 될 수 있는 것들은 함수가 됩니다.

근데 제가 맞게 쓴건가 모르겠네요. -_-;

피할 수 있을때 즐겨라! http://melotopia.net/b

익명 사용자의 이미지

Object-Oriented Programming에서 중요한 것은 Class가 아니라 Object입니다.

언어내에 존재하는 모든 것을 Object로 보고 프로그램을 짜면 OOP가 됩니다.

언어내에 존재하는 모든 것을 Lambda Function으로 보고 프로그램을 짜면 Functional Programming이 되듯이 말이지요.

그리고 설령 내부적으로 함수간의 call로 동작하는 것으로 보여도,

개념적으로는 Object가 다른 Object에 message passing하는 것입니다.

object나 message passing의 개념 자체가 추상적이므로 구체적으로 알려고 하면 오히려 더 이해하기 힘듭니다.

cleansugar의 이미지

저도 처음에 이해가 안가더군요.

쉽게 알려드리지요.

클래스는 필드(멤버변수)랑 메소드(멤버함수)로 이루어져있어요.

필드는 명사갈은 거고 메소드는 동사면서 그냥 함수라고 보면 되요.

이걸 fruit a=new fruit(); 이렇게 실행하면 메모리에 생성되는 게 객체예요.

다른말로 인스턴스라고 합니다.

쉽게 말해서 클래스는 C에서의 함수 안에 변수도 딸려있다고 보시면 됩니다.

구조체가 변한거죠.

이 클래스를 명사로 쓸 때는 total=fruit(5); 이렇게 하면 되고, 동사로 쓸 때는 fruit.fall; 이렇게 하면 됩니다.

http://book.naver.com/bookdb/book_detail.nhn?bid=6600168

이 책을 본적은 없지만 객체지향이 제일 쉽게 나와있을 겁니다.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

emptynote의 이미지

c++는 c언어의 경험을 바탕으로 나온 언어입니다.

c언어로 객체지향적인 개발의 좋은 예로 c언어 버전의 gtk를 들 수 있겠네요.

참고 : http://zetcode.com/tutorials/gtktutorial/introduction/ 에서 인용 => "The GTK+ is an object oriented application programming interface."

순수하게 c 언어 관점에서 class 는 .h+.c 입니다. 그거로 충분합니다.

(1) 좋은 헤더파일(.h)이란 무엇인가?

(2) 좋은 소스파일(.c)이란 무엇인가?

질문(1)은 분명 c 언어 질문이지만 또한 좋은 class를 만들기 위한 전제 조건에 대한 질문이기도 합니다.

snowall의 이미지

이런 해석은 처음 봅니다. 새로운 시각에 눈을 뜨게 되었네요.

피할 수 있을때 즐겨라! http://melotopia.net/b

cleansugar의 이미지

참고

C로 객체지향 코드만들기.
http://kldp.org/node/31502

C언어 객체지향 프로그래밍
http://kldp.org/node/120667

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

yielding의 이미지

질문하신 용어에서 object/instance, class, method, instance variable은 dynamic OOPL에서 사용되고 이에 대응하는 c++의 용어는 object, class, member function, member variable입니다. 각각의 의미는 위에 분들이 잘 설명해 주셨지요.

다음 글타래에 [http://kldp.org/node/123799] 비슷한 질문과 답변이 있습니다. semmal님의 권유처럼 객체지향의 개념을 배우기 위해서는 순수 객체지향 언어를 공부해보시는 것이 가장 좋은 선택인듯 합니다.
squeak (Squeak is a modern, open source, full-featured implementation of the powerful Smalltalk) ruby 등의 언어에서는 모든 것이 객체입니다.

참고로, 저는 c++을 아끼고 오랫동안 써오고 있지만 c++로 객체지향을 공부하는 것은 권하고 싶지 않습니다. c++은 procedural/oo/generic/functional 프로그래밍이 가능한 multi-paradigm언어이고 그 양과 복잡도 때문에 공부의 방향이 자칫 잘못되면 객체지향 공부, 혹은 문제를 푸는 본질에서 벗어나 c++ 언어 자체에 빠져버리게 되는 경향이 있습니다.

제 생각에 가장 실용적인 접근은 python을 공부하시는게 어떨까 합니다.(참고로 전 ruby를 좋아합니다만..) C처럼 딱딱한 언어와 python처럼 말랑말랑한 언어를 같이 쓰면 생산성도 좋아지고 사고도 유연해지는 효과가 있습니다. 두 언어는 embedding과 extending을 통해 서로 보완하는 효과도 있습니다. 갑자기 perky님이 생각나네요. (python이 순수 객체지향 언어는 아니지만 뭐 어떻습니까, 좋으면 그만이죠.)

Life rushes on, we are distracted