Favicon

Assignment operators (=)

Peponi12/19/20244m

C#
SyntaxOperator=

1. Introduction

대입 연산자 (=) 는 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당한다. 변수, 속성, 인덱서에 할당 가능하며 오른쪽 피연산자의 형식은 왼쪽 피연산자의 형식과 동일하거나 암시적으로 변환할 수 있어야 한다.

2. Assignment operator

다음 두 식은 동일한 결과를 가져온다.

a = b = c;
a = (b = c);

즉, = 연산자는 오른쪽에서부터 왼쪽으로 연산을 수행한다.

2.1. 값 형식

왼쪽 피연산자가 값 형식인 경우 = 연산은 오른쪽 피연산자의 값을 복사한다.

int X = 1;
int Y = 2;
 
X = Y;
 
Console.WriteLine(X);
Console.WriteLine(Y);
 
Y = 10;
 
Console.WriteLine(X);
Console.WriteLine(Y);
 
/* output:
2
2
2
10
*/

2.2. 참조 형식

왼쪽 피연산자가 참조 형식인 경우 = 연산은 오른쪽 피연산자의 참조를 복사한다.

public class Foo
{
    public int Bar { get; set; }
}
 
var foo = new Foo();
foo.Bar = 5;
 
var newFoo = foo;
newFoo.Bar = 10;
 
Console.WriteLine(foo.Bar);
Console.WriteLine(newFoo.Bar);
 
/* output:
10
10
*/

3. ref 할당

ref 할당 (= ref) 왼쪽 피연산자를 오른쪽 피연산자의 별칭으로 만든다. 왼쪽 피연산자는 ref 변수, ref 필드, 메서드 파라미터 (in, out, ref) 가 될 수 있다.

int X = 1;
ref int Y = ref X;
 
Y = 5;  // 별칭으로 만들었기 때문에 X 값이 업데이트된다
 
Console.WriteLine(X);
 
/* output:
5
*/

4. 복합 할당 식

복합 할당은 아래의 이진 연산자를 통해 사용할 수 있다.

이진 연산자를 이용한 복합 할당 식은 아래와 같다.

X op= Y
 
// 위 식은 아래의 연산을 수행한다.
 
X = X op Y

위 예제의 두 식의 연산은 동일하지만 캐스팅이 다르게 될 수 있다. 조금 더 자세히 풀어보면 아래와 같다.

byte X = 255;
byte Y = 1;
 
// X op= Y. 아래 코드는 실제로는 수행 불가 (byte 연산 시 int로 변환됨)
X = (int)X + (int)Y;
 
// X = X op Y
X = (byte)((int)X + (int)Y);

위 예제로 알 수 있듯 캐스팅이 다르게 진행되는데, 이로 인해 의도치 않은 결과를 가져올 수 있다.

// X = X op Y
var Z = X + Y;
 
Console.WriteLine(Z);
Console.WriteLine(Z.GetType());
 
// X op= Y
X += Y;
 
Console.WriteLine(X);
Console.WriteLine(X.GetType());
 
/* output:
256
System.Int32
0
System.Byte
*/

따라서 연산 시 형식에 대한 주의가 필요하다.

5. 참조 자료