다음을 통해 공유


대입 연산자(C# 참조)

대입 연산자 =은 오른쪽 피연산자의 을 왼쪽 피연산자가 제공하는 변수, 속성 또는 인덱서 요소에 할당합니다. 대입식의 결과는 왼쪽 피연산자에 할당된 값입니다. 오른쪽 피연산자의 형식은 왼쪽 피연산자의 형식과 동일하거나 왼쪽 피연산자의 형식으로 암시적으로 변환할 수 있어야 합니다.

= 대입 연산자는 오른쪽에서부터 결합됩니다. 즉, 다음 형식의 식이 있습니다.

a = b = c

다음과 같이 평가됩니다.

a = (b = c)

다음 예제에서는 로컬 변수, 속성 및 인덱서 요소를 왼쪽 피연산자로 포함해서 대입 연산자를 사용하는 방법을 보여 줍니다.

List<double> numbers = [1.0, 2.0, 3.0];

Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100

int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5

할당의 왼쪽 피연산자는 오른쪽 피연산자의 을 받습니다. 피연산자가 값 형식인 경우 할당은 오른쪽 피연산자의 콘텐츠를 복사합니다. 피연산자가 참조 형식인 경우 할당은 개체에 대한 참조를 복사합니다.

이 작업을 값 할당이라고 합니다. 값이 할당됩니다.

C# 14부터 값 할당의 왼쪽에는 null 조건부 멤버 식(예: ?. 또는 ?[])이 포함될 수 있습니다. 왼쪽 표현식이 null이면 오른쪽 표현식이 평가되지 않습니다.

참조 할당

Ref 할당= ref은 다음 예에서 볼 수 있듯이 왼쪽 피연산자를 오른쪽 피연산자의 별칭으로 만듭니다.

void Display(double[] s) => Console.WriteLine(string.Join(" ", s));

double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);

ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);

arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5

앞의 예에서 로컬 참조 변수arrayElement는 첫 번째 배열 요소에 대한 별칭으로 초기화되었습니다. 그런 다음 마지막 배열 요소를 참조하도록 ref가 다시 할당됩니다. 별칭이므로 일반 대입 연산자 =을 사용하여 해당 값을 업데이트하면 해당 배열 요소도 업데이트됩니다.

ref 할당의 왼쪽 피연산자는 로컬 참조 변수, ref 필드ref, out 또는 in 메서드 매개 변수일 수 있습니다. 두 피연산자는 모두 동일한 형식이어야 합니다.

할당은 ref 참조 변수에 다른 참조가 있음을 의미합니다. 더 이상 이전 참조 대상과 관련이 없습니다. 매개 변수에서 사용 ref = 한다는 ref 것은 매개 변수가 더 이상 해당 인수를 참조하지 않음을 의미합니다. 참조를 재할당한 후 개체의 상태를 수정하는 모든 작업은 새 항목에 해당 수정 사항을 적용합니다. 예를 들어 다음 방법을 고려합니다.

private static void RefReassignAndModify(scoped ref string s)
{
    string sLocal = "Hello";
    Console.WriteLine(sLocal);  // Output: Hello

    s = ref sLocal;
    s = "World";
    Console.WriteLine(s);  // Output: World

다음은 문자열이 수정되기 전에 ss를 참조하도록 ref 다시 할당되었기 때문에 메서드 호출 후 매개 변수 sLocal의 할당이 표시되지 않는다는 것을 보여줍니다.

string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!

복합 할당

이진 연산자 op에 대한 복합 할당 식

x op= y

에 해당합니다.

x = x op y

단, x 한 번만 평가됩니다.

산술, 부울 논리비트 논리 및 시프트 연산자는 모두 복합 할당을 지원합니다.

null 병합 할당

왼쪽 피연산자가 ??=로 평가되는 경우에만 null 병합 대입 연산자 null을 사용하여 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당할 수 있습니다. 자세한 내용은 ?? 연산자??= 문서를 참조하세요.

연산자 오버로드 가능성

사용자 정의 형식은 대입 연산자를 오버로드할 수 없습니다. 그러나 사용자 정의 형식은 다른 형식으로 암시적 변환을 정의할 수 있습니다. 이렇게 하면 사용자 정의 형식의 값을 다른 형식의 변수, 속성 또는 인덱서 요소에 할당할 수 있습니다. 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.

사용자 정의 형식이 이진 연산자를 오버로드하는 경우 연산 opop= 자(있는 경우)도 암시적으로 오버로드됩니다. C# 14부터 사용자 정의 형식은 보다 효율적인 구현을 제공하기 위해 복합 할당 연산자(op=)를 명시적으로 오버로드할 수 있습니다. 일반적으로 이진 작업의 결과를 유지하기 위해 새 인스턴스를 할당하는 대신 값을 현재 위치에서 업데이트할 수 있으므로 형식이 이러한 연산자를 오버로드합니다. 형식이 명시적 오버로드를 제공하지 않으면 컴파일러는 암시적 오버로드를 생성합니다.

C# 언어 사양

자세한 내용은 C# 언어 사양대입 연산자 섹션 및 사용자 정의 복합 할당 기능 사양을 참조하세요.

관련 항목 보기