C언어로 객체(object) 지향적 코딩

rgbi3307의 이미지

C++ 언어가 객체 지향적 코딩을 위해 class라는 자료형을 새롭게 도입하면서
OOP(Object Oriented Programming)을 위해 기존의 C언어를 버리고 C++언어로 개발언어를 많이들 변경한듯 합니다.
하지만, C언어에서도 우리가 이미 알고 있는 struct 자료형과 함수 포인터를 활용하여 객체 지향적 코딩을 할 수 있다는
것에 대해서 여러분들의 의견은 어떤지요?
그럼, C언어에서 어떤 코드들이 객체 지향적일까요?

struct list {
char name[16];
int var1;
int var2;
int (*func)(const char *argc);
struct list head;
}

C언어의 위의 구조체를 객체로 본다면,
구조체 변수들은 Member가 되고 함수 포인터는 Method가 된다고 할 수 있나요?
그럼 C++언어의 class에서 private과 public에 해당하는 것을 C언어에서는 어떻게 코딩하면 될까요?
그외에 객체지향적 기법들을 C언어에서 어떻게 표현할 수 있을까요?
저도 많이 부족하여 서로 공유해 봤으면 합니다.

익명 사용자의 이미지

펑션포인터는 디버깅하기 까다로워서.. 보통은 this를 명시적 함수 인자로 전달하는 방식으로 많이 하는 듯합니다.

예를 드신 list 구조체라고 하면... 뭐 이런식이 되겠지요..

aList = (list*)malloc(sizeof(list));
 
append(aList, aElement);
 
theElemenet = tail(aList);

this를 자동으로 잡아주느냐가 객체지향의 핵심이다..라고하면야.. 객체지향이라고 말하기 뭐한 방법입니다만..

실용적 측면에서는 가장 간단 명료한 방법이 아닐까 생각합니다...

익명 사용자의 이미지

첨언하자면.. private 메서드는 static으로 구현가능하겠지요..

empty2fill의 이미지

할수 있는 것과 쉽게 하는 것은 조금 다른 이야기 입니다.

C로도 OOP 스타일로 프로그래밍을 할 수 있지만 C++로 하면 더 쉽고 간결합니다.

그래도 C로 하려는 이유가 있으시겠죠?

인터넷에 찾아보니

xine project에서 C를 이용해 OOP 스타일로 프로그래밍을 했는데요.

class derive 방법과 private member variables 추가 방법이 나오네요.

private와 public 접근 제한 방법은 자세히 나오지 않는데요. private member variables 추가 방법을 응용해 private와 public 구조체를 따로 따로 작성하면 되지 않을까 생각합니다.

아래 링크를 참고 하세요.

Object oriented programming in C
http://www.xine-project.org/hackersguide#id324430

들어가 보면 왜 C++을 사용하지 않는지 나오는데요. 필요한 부분만 간략히 번역해 보면 이렇습니다.

Why not using C++?
xine은 빨라야 하는데 C++은 느리다. 최근에는 C++로도 빠르게 짤 수 있지만, C++을 모든 플랫폼에서 충분히 지원하는 것은 아니다.
C++은 컴파일러가 복잡해 C보다 최적화 하기 어렵고, 컴파일 속도가 느리다.
C++ ABI는 C ABI에 비해 잘 정의되지 않았다. C는 다른 라이브러리나 다른 컴파일로 만든 어플리케이션과 잘 연동할 수 있다.
xine은 상속을 복잡하게 사용하지 않는다.

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

klara의 이미지

C로 객체 지향적으로 코딩하는 방법은 이미 잘 알려져 있습니다. 그렇게 만들어진 대표적인 예가 gtk구요.

icj7061의 이미지

vala(발라?)라고요, 문법자체는 C#과 비슷하고요, 빌드하면 다시 그게 C코드로 바뀌어서 컴파일됩니다.
하지만 c랑 똑같이 오버로딩은 안됩니다.
사용해보시면 아실테지만 gobject와 C를 이용하면 객체지향이 가능하지만 메크로가 장난아니게 들어가죠.

그외에도 oop in c라고 google에 쳐보세요. 아주 좋은 pdf가 있습니다.

rgbi3307의 이미지

안녕하세요? 좋은자료 공유 감사합니다.
말씀하신 PDF를 보니 1993년(20년전)에 C언어로 OOP를 구현하는 방법들을 체계적으로 정리한듯합니다.
그래서 C++ 언어가 탄생하기도 했는것 같습니다.
문제는 이것을 자기의 BL(Bussiness Logic)에 맞게끔 잘 활용할 수 있도록 하는 것인듯합니다.
어플리케이션이 사용자 UI가 강조되는 부분이라면 C++, C#등의 언어로 효율적으로 코딩하는 것이 좋겠고,
속도나 크기등에 민감한 시스템프로그램, 특히 운영체제(커널) 쪽이라면 C언어가 더 좋겠다는 생각입니다.
특히 커널 소스들을 분석하다 보면, C언어를 OOP 형태로 코딩한 것들이 많아서 발제글을 올려 봤는데,
커널 소스를 좀 더 쉽게 이해할 수 있도록 분석 자료를 정리해 보려고 노력중입니다.
틈틈히 결과물들을 공유해볼 생각입니다.

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.