[Step 02-1] 클래스(class), 핸들(^), 그리고 구조체(struct)
C와 C++의 큰 차이점의 하나가 바로 C++에만 있는 ‘클래스’입니다. 또 클래스는 객체 지향 프로그래밍 언어에서 자주 볼 수 있습니다.
C++/CLI에서 관리 클래스는 ‘ref’라는 키워드를 사용하여 만듭니다.
비 관리 클래스
class Test
{
};
관리 클래스
ref class Test
{
};
관리 클래스는 ‘ref’를 제외하고는 외관상으로는 비 관리 클래스와 비슷하지만 관리와 비 관리가 많이 다르듯이 관리 클래스는 비 관리 클래스와 다른점이 있습니다. 그러므로 이것을 잘 파악하고 있어야 합니다.
관리 클래스의 특징
1. 정적 할당은 안 된다. 무조건 가비지컬렉션(GC)에 동적으로 생성한다.
2. 복사 생성자를 만들 수 없다.
3. ‘^’(핸들이라고 부른다)과 ‘gcnew’를 사용하여 클래스를 생성한다. 당근 메모리 해제는 GC에서 관리한다.
4. 핸들은 네이티브의 ‘*’(포인터) 나 ‘&’(참조)와 비슷한 것으로 더 안정스럽다.
5. ‘delete’는 명시적으로 클래스에서 사용하고 있는 리소스를 해제할 때 사용하는 것으로 ‘소멸자’가 호출 되는 것이지 메모리에서 해제하는 것은 아니다. 즉 delete로 GC에 있는 메모리를 해제하는 것은 아니다.
6. delete로 소멸자를 호출하면 GC에 의해서 진짜 파괴될 때 소멸자는 호출되지 않는다.
(소멸자를 선언한 클래스는 자동적으로 IDisposable 인터페이스를 구현한다. 소멸자는 컴파일러에 의해서Dispose() 메소드로 치환된다).
7. 소멸자 이외에 'finalize'를 선언할 수 있다. finalize는 GC에서 인스턴스가 파괴될 때 호출된다. 단 delete로 소멸자를 호출한 경우에는 finalize는 호출되지 않는다.
8. finalize는 ‘!’ 키워드를 사용한다.
관리 클래스 사용해 보기
< 코드 1. 관리 클래스 정의 및 사용 >
#include "stdafx.h"
using namespace System;
ref class ManagedTest
{
public:
ManagedTest() { Console::WriteLine(L"New ManagedTest"); }
~ManagedTest() { Console::WriteLine(L"delete ManagedTest"); }
!ManagedTest() { Console::WriteLine(L"finalize ManagedTest"); }
};
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"1.");
ManagedTest^ MTest1 = gcnew ManagedTest();
delete MTest1;
Console::WriteLine(L"2.");
ManagedTest^ MTest2 = gcnew ManagedTest();
return 0;
}
< 결과 >
<코드 1> 설명
< 그림 1. <코드 1>의 소스 코드와 결과 >
<그림 1>의 코드를 보면 3번의 ‘gcnew’, 4번의 ‘^’를 사용하여 ManagedTest를 생성하였습니다.
<코드 1>에는 없지만 핸들은 포인터와 같은 것으로 관리 클래스의 멤버를 사용할 때는 ‘->’를 사용합니다.
5번 delete를 사용하면 소멸자가 호출되어서 6번이 출력됩니다.
MTest2는 소멸자를 호출하지 않아서 8번에서 정의한 finalize가 프로그램이 종료할 때 호출됩니다(7번).
<코드 1>은 아주 짧고 단순한 코드이지만 관리 클래스의 대부분의 특징을 다 나타내고 있습니다. 관리 클래스에 대한 설명은 아직 남아 있습니다. 이것은 다음 회에 또 설명하겠습니다.
cnf
'Programming > C++/CLI' 카테고리의 다른 글
C++/CLI 데이터 타입에 따른 리턴값, 파라미터 처리 (ActvieX ↔ C++/CLI ↔ C#) (0) | 2010.10.05 |
---|---|
[Step.02-2] 클래스(class), 핸들(^), 그리고 구조체(struct) (0) | 2010.10.05 |
C + + 프로그래머를위한 C + + / CLI 소개 (0) | 2010.10.05 |
C++/CLI article in MSDN (0) | 2010.10.02 |
C++ Interop 사용(암시적 PInvoke) (0) | 2010.09.14 |