virtual와 override 문의 사용법에 대해서

31395 
Created at 2007-02-06 01:33:09 
342   0   0   0  

객체지향에서 일종의 불문율같은 코딩 방식이 있습니다. 컴파일러가 반드시 그렇게 코딩해야 한다고 강제하지는 않으나, 반드시 그렇게 코딩하는 것이 옳다고 하는 방식입니다. 이는 오랜 동안 객체지향 기법을 연구한 끝에 여러 개발자들이 동의하는 사항들입니다. 그런 불문율 중에 몇가지를 논해 보려 합니다.

------------------------------------------------------------
먼저 상위 클래스 메서드를 재정의할 때 사용하는 override문을 언제 사용하는가에 관한 것입니다.

이에 대한 룰은 다음과 같이 정리할 수 있습니다.

상위 클래스에서 virtual로 정의한 메서드를 하위 클래스에서 재정의할 때는 반드시 override 문을 사용하십시요.

이렇게 하지 않는 것은 virtual 메커니즘을 사용하는 근본 원칙을 위배하기 때문입니다. 따라서, 다음과 같은 코드로 작성하면, 상위 클래스의 virtual 메서드를 하위 클래스에서 일반 메서드로 바꾸는 것이 되기 때문에, 델파이 컴파일러는 경고를 날립니다.

TBase = class(TObject)
  public
    procedure VirtualMethod; virtual;
    procedure StaticMethod;
  end;

  TDerived = class(TBase)
  public
    procedure VirtualMethod; // override; 오버라이드 문이 없으면 경고 발생
  end;
 
  델파이 컴파일러 경고문.
  [Warning]Method 'VirtualMethod' hides virtual method of base type 'TBase';
 
virtual메서드를 사용한다는 것은 하위 클래스에서 이 메서드를 재정의할 필요가 있다고 선언하는 것이기 때문에, override를 사용하지 않으면, 이 virtual 메커니즘이 무효화되어, 하위 클래스에서 VirtualMethod는 일반 메서드가 되어 버립니다. 이는 virtual 메서드가 실제 실행시 클래스에 따라서 호출된다는 메커니즘이 사라진다는 것이 됩니다.

------------------------------------------------------------
그렇다면 상위 클래스의 일반 메서드를 하위 클래스에서 재정의하면 어떻게 될까요? 이 경우 델파이는 아무런 경고도 없지만, 이는 심각한 클래스 설계 오류일 수 있습니다. 상위 클래스와 하위 클래스에 동일한 메서드가 존재한다는 것은 사용법이 엄청 까다로운 클래스가 되기 때문입니다.

// 위험함 클래스 설계
  TBase = class(TObject)
  public
    procedure VirtualMethod; virtual;
    procedure StaticMethod;
  end;

  TDerived = class(TBase)
  public 
    procedure StaticMethod; // override; 이 경우는 override문을 사용하면 명백히 컴파일 에러입니다.
                                // override는 상위 클래스에서 이 메서드가 virtual일때만 사용가능합니다       
  end;

------------------------------------------------------------ 
객체지향에서 virtual에 대한 또하나의 묵시적 코딩 룰은, 모든 파괴자 메서드는 반드시 virtual로 선언하라는 것입니다. 이는 대부분 객체들의 파괴자가, 실행시 클래스 타입에 따라서 올바른 파괴자가 호출되도록 보장하기 위함입니다. 여기서 그 이유를 설명하는 것은 복잡하므로 생략하지만, 이는 대부분 객체지향에 관한 책에서 필히 그렇게 할 것을 권하는 불문율입니다. 이 코딩 약속을 지켜야만 안전합니다. 이 때문에 파괴자를 재정의할 때 델파이 컴파일러는 강요하지 않지만, override를 반드시 사용해야만 합니다. 이 메커니즘을 깨면 엄청 골치 아픈 버그를 경험할 수 있으니 필히 지키길 권합니다.

  TDerived = class(TBase)
  public
    destructor Destroy; override; // 만일 override문을 지우면, 저 앞과 비슷한 경고 발생
  end;

TObject.Destroy는 이미 virtual로 정의되어 있습니다.

------------------------------------------------------------
객체를 파괴할 때는 반드시 Free메서드나 FreeAndNil함수를 사용하십시요. Destroy메서드를 직접 부르는 것은 위험한 상황을 초래할 수 있습니다. 그 이유는 델파이 매뉴얼에 잘 기술되어 있습니다.

------------------------------------------------------------
생성자와 파괴자를 재정의할 때, 사용자가 추가하는 코드의 위치가 서로 반대입니다.

constructor TDerived.Create;
begin 
  // 간혹가다 사용자 코드를 여기에 둡니다.
  inherited;
  // 대부분의 경우 사용자 코드는 여기 둡니다.
end;

destructor TDerived.Destroy;
begin
  // 파괴자인 경우, 사용자 코드는 여기 둡니다.
  inherited;
  // 파괴자에서 이부분에 코드를 둬야 할 경우는 아직 저는 찾지 못했습니다.
end;

inherited문은 상위 클래스에서 현재 메서드와 동일한 메서드를 호출하는 약어입니다. 생성자의 경우 사용자 코드를 필요에 따라서 inherited문을 아래위에 코드를 둘 수 있지만, 파괴자의 경우, 대부분 inherited 이전에 사용자 코드를 둡니다. 생성자는 자신의 최상위 클래스 생성자, 그 다음 상위 클래스 생성자 순으로 호출하지만, 파괴자는 이와 역순으로 상위 클래스의 파괴자를 호출하기 때문입니다.

따라서 명백한 이유가 없다면 생성자와 파괴자에 코드를 추가할 때는 반드시 이 원칙을 따르십시요

----------------------------------------------------------------
C++과는 달리 델파이에는 클래스 레퍼런스 혹은 메타 클래스라는 개념이 있습니다. 이는 클래스 자체를, 즉 클래스 타입 자체를 함수나 메서드에 인수로 전달할 수 있는 기능입니다. 이는 C++의 템플리트 기능과 유사한 면이 많지만, 제 개인적으로는 C++ 템플리트보다 월등히 편하다고 생각합니다. 어쨋든 이 클래스 레퍼런스를 제대로 사용하려면, TObject의 생성자와 TComponent의 생성자의 모양이 좀 다르다는 점에 유의해야 합니다.

TObject의 생성자
            constructor Create;

TComponent의 생성자
        constructor Create(AOwner: TComponent); virtual;
       
TObject와 달리 TComponent의 생성자는 virtual로 선언되어 있다는 점에 유의해야 합니다. 따라서 TComponent 이하의 클래스에서 상속받아 만든 클래스는 생성자를 재정의 할 때 반드시 override문을 사용해야 합니다. 이를 잊어먹으면 후일 그 클래스의 클래스 레퍼런스를 사용할 때 원치 않는 결과가 발생합니다.

  TMyComponent = class(TComponent)
  public
    constructor Create(Owner:TComponent); override; // 반드시 override문을 사용 하십시요.   
    destructor Destroy; override;        // 파괴자역시 반드시 override문을 사용하십시요.
  end;
 
------------------------------------------------------------------
virtual 메서드는 객체지향에서 매우 중요하며너 막강한 기능입니다.



Tags: 윈도우즈 Share on Facebook Share on X

◀ PREVIOUS
델파이로 긁어오는 HTML 페이지
▶ NEXT
훅 인스턴스의 생성과 해제
  댓글 0
로그인을 하시면 댓글을 등록 할 수 있습니다.
SIMILAR POSTS

델파이로 긁어오는 HTML 페이지 (created at 2007-02-06)

훅 인스턴스의 생성과 해제 (created at 2007-02-06)

Apple iPod Remote Control Protocol (created at 2007-02-06)

대문자, 소문자 변환 함수 (created at 2007-02-14)

PC에서 동영상 삭제가 안될때. (created at 2007-02-14)

마우스 커서 모양바꾸기 (created at 2007-01-28)

Windows95/98 암호 알아내기 (created at 2007-01-28)

작업관리자에서 윈도우 감추기 (created at 2007-01-26)

여러가지 시스템 종료 기법 (created at 2007-01-26)

키보드로 마우스 커서 움직이기 (created at 2007-01-26)

파일 등록정보 보여주기 (created at 2007-01-26)

대화상자에 비트맵 올리기 (created at 2007-01-26)

다이얼로그 리소스대로 폼뷰 크기 설정하기 (created at 2007-01-26)

CD, 플로피등의 디스크 삽입 자동 판단루틴 (created at 2007-01-26)

리스트박스 엔터처리 (created at 2007-01-26)

뷰의 배경색 바꾸기 (created at 2007-01-26)

버튼으로 해당 윈도우 종료하기 (created at 2007-01-26)

태스크 바를 없애버리고 싶다 (created at 2007-01-26)

태스크 바에서 프로그램(윈도우) 제목 숨기기 (created at 2007-01-26)

네임드 커널 오브젝트를 사용한 중복 실행 방지법 (created at 2007-01-26)

MSN Live Messenger가 동작이 안되요 (created at 2007-01-26)

WinGate 깔았더니 블루스크린이 떠요 (created at 2007-01-25)

mdb 파일의 암호깨기 (created at 2007-01-25)

윈도우 버전 알아내는 함수 (created at 2007-01-25)

DEP 기능 비활성화 (created at 2007-01-24)

버퍼 오버 플로우 공격과 DEP (created at 2007-01-24)

Internet Explorer가 자주 비정상 종료 할때 (created at 2006-12-29)

VC 에서 자동으로 빌드 넘버 증가하기 (created at 2006-12-28)

GetDC()의 메모리 누수 막기 (created at 2006-12-27)

모달리스 다이얼로그 와 메모리 리크(Leaks) (created at 2006-12-27)

MFC의 TRACE() 출력 빼먹는 현상 (created at 2006-12-27)

간단히 WIN32에서 MFC의 메모리 누수 체크하는 방법 (created at 2006-12-27)

VC++ 6.0 에서 GDI+ 사용하기.. (created at 2006-12-27)

GDI+를 이용한 회전 3가지.... (created at 2006-12-27)

MFC의 GDI/GDI+ 리소스 누수 현상 (created at 2006-12-27)

UTF-8로 파일 저장하기 (created at 2006-12-22)

Internet Explorer의 검색창에서 한글 입력이 안될때 (created at 2006-11-24)

프린터 인쇄 취소가 안될때 (created at 2006-11-24)

spoolsv.exe의 문제 cpu점유률 100% (created at 2006-11-24)

Region을 이용한 부정형 윈도 만들기 (created at 2006-11-16)

ShellExecuteEx를 이용한 커맨드라인 기반 어플리케이션 실행 (created at 2007-05-07)

특정 폴더의 특정 파일만 파일명으로 지우기 (created at 2007-05-07)

노턴 고스트 2005 (9.0) 설치 및 사용방법 (created at 2007-05-13)

WindowsXP 부팅시 부팅 로고 안나오게 하는 방법 (created at 2007-05-14)

초창기 윈도우즈 (created at 2007-05-16)

리아(RIA)가 온다...리아를 주목하라... (created at 2007-05-16)

윈도의 묵묵부답! '무응답 시간' 단축하기 (created at 2007-05-18)

폴더 창 실행 속도 끌어올리기 (created at 2007-05-18)

PC가 점점 느려지고 있다면 바탕화면에 있는 단축 아이콘이 점유하는 메모리 용량을 되찾아라 (created at 2007-05-18)

프로그램 목록에서 지워지지 않는 목록 지우기 (created at 2007-05-18)

OTHER POSTS IN THE SAME CATEGORY

윈도의 묵묵부답! '무응답 시간' 단축하기 (created at 2007-05-18)

리아(RIA)가 온다...리아를 주목하라... (created at 2007-05-16)

WindowsXP 부팅시 부팅 로고 안나오게 하는 방법 (created at 2007-05-14)

노턴 고스트 2005 (9.0) 설치 및 사용방법 (created at 2007-05-13)

php로 년,월,일 요일 구하기 (created at 2007-05-11)

매번 rand결과가 같게 나오지 않게 하려면 (created at 2007-05-08)

PHP, 정규분포 난수 생성, 가우스 분포 랜덤 발생 함수; Normal Distribution (created at 2007-05-08)

오늘 날짜를 문자열로 변환 (created at 2007-05-08)

특정 폴더의 특정 파일만 파일명으로 지우기 (created at 2007-05-07)

ShellExecuteEx를 이용한 커맨드라인 기반 어플리케이션 실행 (created at 2007-05-07)

PC에서 동영상 삭제가 안될때. (created at 2007-02-14)

대문자, 소문자 변환 함수 (created at 2007-02-14)

HTML Color Table (created at 2007-02-08)

Apple iPod Remote Control Protocol (created at 2007-02-06)

훅 인스턴스의 생성과 해제 (created at 2007-02-06)

델파이로 긁어오는 HTML 페이지 (created at 2007-02-06)

Apache rewrite 사용 방법 (created at 2007-02-02)

태터툴즈에서 게시물을 id가 아닌 제목으로 뿌리는 방법 (created at 2007-02-02)

애드센스 기록기, Mysense! (created at 2007-02-02)

소켓으로 메일보내기 (created at 2007-01-30)

실수로 삭제한 mysql DB 복구방법 (created at 2007-01-30)

MySQL root 패스워드 분실했을 경우 (created at 2007-01-30)

컴퓨터 활용팁 100가지 (created at 2007-01-30)

마우스 커서 모양바꾸기 (created at 2007-01-28)

이미지가 많아서 로딩할때 시간이 많이걸릴 경우 (created at 2007-01-28)

스크롤바에 붙어다니는 이미지 (created at 2007-01-28)

이미지의 다운로드를 막아주는 스크립트 (created at 2007-01-28)

큰 이미지를 화면크기에 맞게 자동으로 사이즈 조절 (created at 2007-01-28)

랜덤 이미지 로딩시키기 (created at 2007-01-28)

이미지를 서치라이트로 비추는 효과 (created at 2007-01-28)

UPDATES

소녀대 - Bye Bye Girl (updated at 2024-04-13)

대한민국 날씨 근황 (created at 2024-04-13)

성일종 인재육성 강조하며 이토 히로부미 언급 - 인재 키운 선례? (updated at 2024-04-13)

일제강점기가 더 살기 좋았을지도 모른다는 조수연 국민의힘 후보 - 친일파? (updated at 2024-04-13)

Marshall Ha님의 샤오미 SU7 시승기 - 테슬라의 일론 머스크님이 긴장할만한 느낌 (updated at 2024-04-09)

윙크하는 귀염둥이 반려견들 (created at 2024-04-08)

달콤 살벌한 고백 (created at 2024-04-08)

북한 최정예 공수부대 훈련 모습 (updated at 2024-04-02)

맛있었던 친구 어머니의 주먹밥이 먹고 싶어요 (created at 2024-04-02)

자리 마음에 안든다고 6급 공무원 패는 농협 조합장 (created at 2024-03-26)

85세 딸 짜장면 사주는 102세 어머니 (created at 2024-03-26)

1990년대 감각파 도둑 (created at 2024-03-26)

치매에 걸린 69살의 브루스 윌리스가 전부인 데미무어를 보고 한 말 (updated at 2024-03-22)

경제는 대통령이 살리는 것이 아닙니다 라던 윤석열대통령 - 상황 안좋아지자 여러 전략을 펼쳤지만, 부작용 속출했던 2024년의 봄 (updated at 2024-03-13)

극빈의 생활을 하고 배운것이 없는 사람은 자유가 뭔지도 모를 뿐 아니라 왜 개인에게 필요한지에 대한 필요성을 못느낀다는 윤석열 대통령 (updated at 2024-03-08)

조선일보를 안본다는 사람들이 말하는 그 이유 - 천황폐하, 전두환 각하, 김일성 장군 만세? (created at 2024-03-07)

광폭타이어를 장착하면 성능이 좋아질거라는 착각 (updated at 2024-03-03)

면허시험장에서 면허갱신하면 하루만에 끝나나? (updated at 2024-03-03)

신한은행/신한투자증권 금융거래 종합보고서 다운로드 방법 (updated at 2024-02-26)

100년 된 일본 장난감 회사가 내놓은 변신 기술에 난리난 과학계 (created at 2024-02-26)

알리에서 발견한 한글 지원하는 가성비 쩌는 무선 기계식키보드 (updated at 2024-02-25)

쌍팔년도가 1988년인줄 알았던 1인 (updated at 2024-02-23)

이쁜 색으로 변신한 테슬라 사이버트럭 (created at 2024-02-23)

2024년 카타르 아시안컵 4강전 전날 한국 대표팀 내부에 있었던 이강인의 폭주 (updated at 2024-02-21)

강릉 맛집 지도 (updated at 2024-02-20)

간이 안좋을 때 나타나는 증상 20가지 (updated at 2024-02-20)

배설물을 이용하여 일본에 저항했던 독립운동가 조명하 (updated at 2024-02-20)

요건 몰랐지롱? 이순신을 사랑한 외국인 (created at 2024-02-20)

원빈도 머리빨 (created at 2024-02-19)

대표적인 대한민국의 미남배우 중 하나인 원빈 (created at 2024-02-19)

백제의 건국 시조 온조왕 (updated at 2024-02-19)

700년동안 대한민국 고대국가의 한축이었던 백제시대 (created at 2024-02-19)

대머리들에게 주는 대머리의 조언 (created at 2024-02-17)

일본의 여성 락그룹 프린세스 프린세스의 "다이아몬드" (created at 2024-02-17)

결혼식 직전 연락두절된 신랑 (created at 2024-02-17)

대한민국 축구팀 파문으로 인해 중국 소셜미디어까지 등장한 탁구 전도사 이강인 (updated at 2024-02-16)

조국의 반격으로 흥미진진하게 흘러가는 한국의 정치판 - 데뷰와 동시에 한동훈 장관에게 던진 4개의 질문 (updated at 2024-02-15)

2024년 카타르 아시안컵 4강전 전날 내분사태로 갑자기 회자되는 이승우선수의 친화력 (created at 2024-02-15)

카카오뱅크 금융거래종합보고서/잔액증명서/거래내역서 발급 방법 (created at 2024-02-14)

아이가 최고의 스승이었다 (created at 2024-02-13)

이제는 국민 유행어로 등극한 한동훈의 "싫으면 시집가" (updated at 2024-02-13)

설 연휴 잔소리 메뉴판 - 이제 잔소리 하기전에 요금부터... (updated at 2024-02-10)

로버트 드니로의 70년 전 모습 (created at 2024-02-08)

카메라 어플로 만들어본 슈퍼걸 - 엄... 최종 작품은 왠지... (created at 2024-02-08)

앞트임 하고 새롭게 태어난 대한민국의 젊은 용사 (created at 2024-02-08)

비가 억수로 내리던 2024년의 2월 어느날 캘리포니아의 밤 카니예 웨스트와 그의 아나 비앙카 센소리 (updated at 2024-02-08)

스케방형사 1화 - 수수께끼의 전학소녀사키 (created at 2024-02-05)

백제와 일본의 교류가 가장 활발했던 시기는 근초고왕 시대 (created at 2024-02-05)

일에 찌들은 아빠가 꿈에서 깨어나지 않자 구출해주는 짱구 (created at 2024-02-03)

이제는 할아버지가 된 휴 그랜트(Hugh Grant)가 블랙핑크 콘서트에 다녀온 후 소감 (created at 2024-02-03)