Introduction
- 대입 연산자 (
=
) 는 오른쪽 피연산자의 값을 왼쪽 피연산자에 할당한다.- 변수, 속성, 인덱서에 할당 가능하다.
- 오른쪽 피연산자의 형식은 왼쪽 피연산자의 형식과 동일하거나 암시적으로 변환할 수 있어야 한다.
=
연산자
- 다음 두 식은 동일한 결과를 가져온다.
a = b = c a = (b = c)
- 즉,
=
연산자는 오른쪽에서부터 왼쪽으로 연산을 수행한다.
- 즉,
값 형식
왼쪽 피연산자가 값 형식인 경우
=
연산은 오른쪽 피연산자의 값을 복사한다.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 */
참조 형식
왼쪽 피연산자가 참조 형식인 경우
=
연산은 오른쪽 피연산자의 참조를 복사한다.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 */
= ref
할당
ref 할당 (
= ref
) 왼쪽 피연산자를 오른쪽 피연산자의 별칭으로 만든다.
복합 할당 식
복합 할당은 아래의 이진 연산자 (
op
) 를 통해 사용할 수 있다.이진 연산자를 이용한 복합 할당 식은 아래와 같다.
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 */
따라서 연산 시 형식에 대한 주의가 필요하다.
참조 자료
- 대입 연산자(C# 참조)
- ref(C# 참조)
- ref 필드
- 값 형식
- 참조 형식
- C# - Language - In keyword (Parameter modifier)
- C# - Language - Out keyword (Parameter modifier)
- C# - Language - Ref keyword (Parameter modifier)
- C# - Language - +, - operator (Arithmetic operator)
- C# - Language - *, /, % arithmetic operator
- C# - Language - Logical operators (!, &, |, ^, &&, ||)
- C# - Language - Bitwise and shift operators (~, &, |, ^, <<, >>, >>>)