티스토리 뷰
double pi = 3.14; // pi는 Stack에 저장
int^ lucky = gcnew int(7); // lucky는 핸들이며 7은 Heap에 저장된다.
double^ two = 2.0; // two는 핸들이며 2.0은 Heap에 저장된다. 0x588538c
double^ d = gcnew double(3.0); // 3.0 은 Heap 에 저장된다. 0x588539c
two 와 d 는 같은 주소공간에 있으므로 two 가 Heap 에 할당됨을 알 수 있다.
클래스 Class
- friend 지원 안함.
- 네이티브C++ 배열 또는 네이티브C++ 클래스 형식의 멤버 변수를 가질 수 없다.
- 값 클래스 또는 참조 클래스는 비트 멤버 변수를 가질 수 없다.
- 멤버 한수들은 const 로 선언될 수 없다.
- 값 클래스 형식 T에 대한 비정적 함수 멤버 안에 있는 this 포인터는 interior_ptr<T> 형식의 인테리어 포인터
- 참조 클래스 형식 T 안에 잇는 this 포인터는 T^ 형식의 핸들이다.
1. 값 클래스
value class / valur struct
- Stack에 할당
- gcnew 연산자로를 사용하여 값 클래스를 Heap 에 만들 수 있다.
- Heap에 할당된 값 클래스 형식을 참조할때는 추적 핸들을 사용한다.
리터럴 필드 : 변수를 initonly 로 선언하여 상수로 만든다.
2. 참조 클래스
ref class / ref struct
- 네이티브C++ 기능과 유사
- 기본 복사 생성자 또는 기본 할당 연산자가 없어, 필요하면 추가해야 한다.
3. 클래스 속성 (property)
- 속성은 멤버 변수처럼 접근할 수 있는 값 클래스 또는 참조 클래스의 멤버이지만 필드는 아니다.
하나의 속성은 get()/set() 접근자 함수를 가지고 각각의 값을 검색하거나 설정한다.
속성값을 구하기 위해 속성 이름을 사용할때, 그 속성의 get()함수를 호출하고, 할당문의 왼쪽 속성의 이름을 사용할때는 set() 함수를 호출하게 된다.
- 스칼라 속성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
value class Length
{
private:
int feet;
int inches;
public:
property int meters // 속성
{
int get()
{
return feet;
}
void set(int a)
{
feet = a;
}
}
...
};
int main(array<System::String ^> ^args)
{
Length len = Length(6, 9);
Console::WriteLine("{0}", len.meters); // get() 호출
len.meters = 3; // set() 호출
Console::WriteLine("{0}", len.meters); // get() 호출
...
} |
cs |
- 인덱싱 속성 (배열)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
value class Length
{
private:
array<int>^ feet;
public:
Length(...array<int>^ a) : feet(a) {}
property int default[int]
{
int get(int index)
{
if(index >= feet->Length)
throw gcnew Exception(L"Index out of range");
return feet[index];
}
}
...
};
int main(array<System::String ^> ^args)
{
Length^ len = gcnew Length(10, 20, 30, 40, 50);
Console::WriteLine(L"{0}, {1}", len[1], len[2]);
...
} |
cs |
실행결과>
만약, 위 인덱싱 속성 소스의 7행의 default 을 아래 1행 처럼 바꾸면 배열 접근 22행을 아래 3행처럼 해야 한다.
1
2
3 |
property int meters[int]
Console::WriteLine(L"{0}, {1}", len->meters[1], len->meters[2]); |
cs |
실행 결과는 위와 같다.
10행의 initolny 는 상수로 만든다. 네이티브의 const 와 같음
override 는 함수명 뒤에 온다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
#include "stdafx.h"
using namespace System;
value class Length
{
private:
int feet;
int inches;
public:
static initonly int inchesPerFoot = 12; // 상수화 (리터럴 필드)
Length(int ft, int ins) : feet(ft), inches(ins) {}
virtual String^ ToString() override // 재정의
{ return feet + L" feet " + inches + L"inches"; }
Length operator+(Length len)
{
int inchTotal = inches + len.inches + inchesPerFoot * (feet * len.feet);
return Length(inchTotal / inchesPerFoot, inchTotal % inchesPerFoot);
}
};
int main(array<System::String ^> ^args)
{
Length len1 = Length(6, 9);
Length len2 = Length(7, 8);
Length len3 = len1 + len2;
Console::WriteLine(L"{0}", len1.ToString());
Console::WriteLine(L"{0}", len2.ToString());
Console::WriteLine(L"{0}", len3.ToString());
Console::ReadKey();
return 0;
} |
cs |
실행결과>