English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#에서는 이 데이터 유형이 메모리에서 값을 저장하는 방식에 따라 그룹화됩니다. C#은 다음과 같은 데이터 유형 카테고리를 포함합니다:
값 유형
참조형
포인터 유형
데이터 유형이 자신의 메모리 공간에 데이터 값을 저장하는 경우, 이는 값 유형입니다. 이는 이 데이터 유형의 변수가 직접 값을 포함한다는 의미입니다.
모든 값 유형은System.ValueType추정됩니다.System.ValueType또한System.Object추정됩니다.
예를 들어, 정수 변수 int i = 100;
시스템은100은 변수 i에 할당된 메모리 공간에 저장됩니다. 아래는 이를 설명하는 그림입니다:100은 "i"의 메모리(0x239110)에 있는 어떤 가정 위치:
이 데이터 유형 모두 값 유형입니다:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
값형 변수를 하나의 함수에서 다른 함수로 전달할 때, 시스템은 다른 함수에서 변수의 별도의 복사본을 생성합니다. 하나의 함수에서 값을 변경하면, 다른 함수의 변수에는 영향을 미치지 않습니다.
static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); }
100
200
100
위의 예제에서, Main() 메서드의 변수 i를 ChangeValue() 메서드에 전달하고 값을 변경한 후에도 그 값은 변경되지 않습니다.
값형과 달리, 참조형은 값을 직접 저장하지 않습니다. 대신, 저장되고 있는 값을 가리키는 주소를 저장합니다. 다시 말해, 참조형은 다른 데이터를 저장하는 저장소 위치를 가리키는 포인터를 포함합니다.
예를 들어, 다음과 같은 문자열 변수:
string s = "Hello World!!";
아래 그림은 시스템이 위의 문자열 변수에 메모리를 할당하는 방법을 보여줍니다.
위 그림과 같이, 시스템은 변수 s에 메모리의 무작위 위치(0x803200)). 변수 s의 값은 0x600000, 이는 실제 데이터 값의 메모리 주소입니다. 따라서 참조형은 값 자체를 저장하는 대신, 실제 값이 있는 위치의 주소를 저장합니다.
다음은 참조형 데이터 타입입니다:
문자열
배열(요소가 값형이더라도)
클래스
대리자
함수에서 참조형 변수를 다른 함수로 전달할 때, 새로운 복사본을 생성하지 않습니다; 대신 변수의 주소를 전달합니다. 따라서 함수 내에서 변수의 값을 변경하면, 호출된 함수에서도 그 변화가 반영됩니다.
static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); }
Steve
위의 예제에서는 Student 객체 std1 ChangeReferenceType() 메서드에 전달됩니다. 여기서는 실제로 std를 전달합니다.1의 메모리 주소를 변경합니다. 따라서 ChangeReferenceType() 메서드가 StudentName을 변경할 때, 실제로는 std를 변경하고 있습니다.1의 StudentName 객체를 변경하려면 std1와 std2같은 메모리 주소를 가리킵니다.
참조 타입 변수의 기본 값 null은 초기화되지 않았을 때입니다. Null은 어떤 객체도 참조하지 않음을 나타냅니다.
값 타입 변수는 메모리 주소를 저장하지 않기 때문에 Null이 될 수 없습니다. C#20.0은 Null을 할당할 수 있는 타입을 도입했습니다. 이를 사용하면 값 타입 변수에 Null을 할당하거나 값을 할당하지 않고 타입 변수를 선언할 수 있습니다.