본문 바로가기
프로그래밍/PC

Interface 요약 #1

by 사악신 2012. 4. 19.

지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;;

 

 

 

현재, 틈틈이 COM 공부를 하고 있는 중입니다. 해서 interface에 대해 이것저것 살펴보고 있는 중인데요. ^^

 

'사람은 아는 만큼 본다'라는 말을 절감하고 있습니다. 두어 달 전에는 볼 수 없었던 것들이 지금은 보이는 군요. 처음엔 아래 한글을 띄우고 공부한 것들을 강좌형태로 만들 생각이었는데 2페이지 가량 진행하다가 포기하였습니다. 아무래도 시간이 많이 부족하네요. 일단은 추후 문서화 작업을 하기로 하고... 급한대로 여기 게시판에다가 생각나는 부분을 요약할 생각입니다.

 

1. 추상 클래스

  • 일반적인 클래스와 차이는 없으나, 거기에 추상 메쏘드(실제 구현부는 없고 선언부만 있음)를 가지고 있다.
  • 인스턴스화 시킬 경우 컴파일 시 경고 메시지가 뜬다.(어차피 동적바인딩으로 해결하면 되나, 바람직한 방법이 아니다. 물론 인스턴스를 생성할 수는 있다.)
  • 인스턴스화 시키지 않고 사용하는 게 좋다.
  • 추상 메쏘드 선언시 virtual; abstract; 키워드를 동시에 붙여준다.(virtual은 동적 바인딩을 위함이고 abstract는 추상 메쏘드임을 뜻한다. virtual 대신 dynamic 도 가능하다)

 

2. interface 와 추상 클래스 비교

 

:: 추상 클래스

TFormattedNumber = class(TObject)
protected
  function FormattedString: string; virtual; abstract;
end;

(물론, 속성 및 구현부가 있는 메쏘드가 존재해도 상관없다)

 

:: interface

IFormattedNumber = interface(IUnknown)
  function FormattedString: string;
end;

 

  • interface의 이름은 관습적으로 대문자 I로 시작한다.
  • 모든 interface 는 직간접적으로 IUnkonwn을 상속받는다.
  • interface는 인스턴스를 생성할 수 없다.
  • interface는 private, public 등과 같은 영역지시자가 없다. 기본적으로 public 이며 이를 명시적으로 선언할 필요도 없고 선언하면 오류가 발생한다.
  • interface는 속성(멤버 변수)이 없다. 오로지 추상 메쏘드만 있다.
  • 모든 함수 및 프로시져가 기본적으로 virtual abstract 선언이 되어있다. 명시적으로 선언할 필요도 없고 선언하면 오류가 발생한다.

 

3. 동적 바인딩

type
  TFigure = class(TObject)
    procedure Draw; // - 1
  end;

  TCircle = class(TFigure)
    procedure Draw; // - 2 (override 지시자가 없으므로 정적바인딩)
  end;


var
  Figure: TFigure;
  Circle: TCircle;
begin
  Figure:= TFigure.Create;
  Figure.Draw; // 1이 실행된다
  Figure.Free;

  Figure:= TCircle.Create;
  Figure.Draw; // 1이 실행된다 -> 정적바인딩 때문, 컴파일시에 미리 결정된 클래스에 따라~
  TCircle(Figure).Draw; // 2가 실행된다
  Figure.Free;

  Circle:= TCircle.Create;
  Circle.Draw; // 2가 실행된다
  Circle.Free;
end;

 

  • 1의 선언에 virtual 혹은 dynamic 을 붙이고 2의 선언에 override를 붙이면 동적 바인딩이 된다.
  • virtual, dynamic 으로 선언된 메쏘드는 override 지시자를 붙여야 오버라이드된다.
  • virtual 은 속도를 dynamic 은 코드 크기를 최적화 시킨다.
  • 동적바인딩으로 했을 경우
Figure:= TCircle.Create;
Figure.Draw; // 2 가 실행된다.
 
 

 

반응형

댓글