C++ 에 자바의 interface 구문과 비슷한 요소가 있나요?

mykldp의 이미지

자바 프로그래밍을 주로 하다 c++ 프로그래밍을 공부하는 중입니다.

다른건 별로 아쉬운게 없는데 하나 아쉬운 것이 자바의 interface구문이더군요.

interface를 이용해서 전체적인 프레임을 잡아놓고 실제 구현 클래스는 플러그인 식으로 바꿔가며 작업을 하는데 익숙해서요.

또 콜백으로 함수를 이용하는 것 말고, 클래스를 이용할 수도 있으면 좋겠구요.

템플릿을 자바의 interface와 비슷한 역할을 하도록 사용할 수 도 있을 거 같은데..

STL을 보면 interface키워드를 이용한 정의가 없을 뿐이지 사실상 iterator 같은 특정한

인터페이스를 암묵적으로 정의해놓고 사용하는 것 같더군요.

근데 아직 구체적인 감이 안오네요. 컴파일이나 링크 타임에 템플릿을 인스턴스화할 때

인터페이스에 대한 체크가 일어나는 건가요?

음...interface의 상속과 같은 개념도 사용할 수 있을런지..

여하튼 어떤 내용이라도 좋으니 자바의 interface정의와 비슷한 개념을 이용할 수 있는 방법에 대해 이야기들을 해주시면 좋겠습니다.

purewell의 이미지

그냥 virtual 로 선언하고 내용이 없으면 되죠.

예를 들자면...

class MyInterface
{
  public:
    inline virtual void Paint(void) {}
    inline virtual void Clear(void) {}
};

대략 이렇죠

(메소드의 리턴타입을 안 적어줘서 수정했습니다)

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

pynoos의 이미지

class MyInterface 
{ 
  public: 
    virtual int Paint(void) = 0;
    virtual int Clear(void) =0;
};

이런 식으로 선언하면 interface 와 같습니다.

MyInterface의 instance를 만들수는 없으며, 상속해서 모든 pure virtual member function이 override 되었을때 가능하지요.

mykldp의 이미지

자바에 interface가 도입된 이유중의 하나가 다중 상속의 문제 때문이라고 알고 있습니다.

다중 상속에 대해서는 잘 모르지만 가능한 한 사용을 피하라고 하더군요^^;

위 분들이 말씀하신 방법 같이 abstract class를 상속하는 경우에는 다중 상속에서 발생하는 문제들을 피할수 있는지요..

조금 더 설명을 부탁드립니다.

ogre의 이미지

자바는 잘 모르지만, ~^^

interface를 정의 해서 사용하고 싶으면, 위에 있는것 처럼 c++ 에서

abstract class를 설계해서 상속 받아 쓰시면 됩니다. 그리고, abstract class

를 상속한다고 해서 다중상속의 문제점을 자동으로 해결해 주는것은 아닙니다.

다중 상속의 문제점은(일명 다이아몬드 상속)인 경우이죠. 하나의 base class

로부터 상속받은 두개의 클래스를 동시에 상속할때, base class의 멤버가 중복

생성됩니다. 모호해지죠...

해결방법은 base class를 가상상속하여 virtual base class를 만들어 쓰면 됩

니다.

class Base{};

class Derived1 : virtual public Base{};
class Derived2 : virtual public Base{};

class Use : public Derived1,public Derived2 {};

자세한 내용은 책을 참고하세요.

노력하자..^^

kdaek의 이미지

위에 있듯이..
순수가상함수란것을 쓰시면 추상클래스및 인터페이스를 만들 수 있습니다.
순수가삼함수가 하나라도 있으면 그 클래스는 추상클래스가 되며 -> 인스턴스 생성 불가, 상속하여 순수가상함수를 오버라이드 해서 구현해야 함.
순수가삼함수만 있는 클래스는 인터페이스 역할을 합니다. -> 인스턴스 생성 불가, 상속하여 순수가상함수들을 모두 구현해줘야 함.

bookgekgom의 이미지

pure virtual func 참조.

이 답글에 +1

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

bootmeta의 이미지

위 여러 댓글에서 설명했듯이 C++에서 순수 가상 함수를 사용하여 inteface를 구현하는 기법을 mixin이라고 합니다.

"C++ mixin v/s java interfaces (Legacy Design Forum)"

http://www.artima.com/legacy/design/interfaces/messages/74.html

비슷하게 template을 사용하여 inteface를 구현하는 방법도 있습니다.

"Mixin-Based Programming in C++"
http://www.ddj.com/cpp/184404445

ps) 실제 mixin은 c++에만 적용되는 기법이 아니라 oop에서 사용되는 폭넓은 개념입니다.
http://en.wikipedia.org/wiki/Mixin

Scarecrow의 이미지

struct MyInterface 
{ 
    virtual int Paint(void) = 0;
    virtual int Clear(void) = 0;
    virtual ~MyInterface() {}
};

가상소멸자가 없다면 메모리 누수가 발생할 것같네요....

mg2000의 이미지

얼마전에 책 읽으면서 본 내용인데...

이 글을 보면서, 다시 되새기게 되네요.

그냥 잡담이었습니다. ^^;;;;;;;;;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.