Value Type과 Reference Type

One·2022년 12월 16일
0

C#

목록 보기
3/3
post-thumbnail

C#에서 다루는 Type에는 Value Type과 Reference Type으로 두 가지가 있으며 둘 중 하나로 반드시 분류된다. 구조체는 Value Type이고 클래스는 Reference Type이다. int, long, decimal, char, byte 등이 Value Type이고 object, string은 Reference Type이다.

Value Type과 Reference Type 이 두가지 Type이 프로그래밍에 어떤 영향을 주는지 다음 코드를 보면 알 수 있다.

struct MyPoint {
	public int X { get; set; }
	public int Y { get; set; }

	public MyPoint(int x, int y) {
		this.X = x;
		this.Y = y;
	}
}

...

// Value Type의 동작을 확인
MyPoint a = new MyPoint(10, 20);
MyPoint b = a;

Console.WriteLine("a: ({0}, {1})", a.X, a.Y);  // 실행 결과 : a: (10, 20)
Console.WriteLine("b: ({0}, {1})", b.X, b.Y);  // 실행 결과 : b: (10, 20)

a.X = 80;

Console.WriteLine("a: ({0}, {1})", a.X, a.Y);  // 실행 결과 : a: (80, 20)
Console.WriteLine("b: ({0}, {1})", b.X, b.Y);  // 실행 결과 : b: (10, 20)

아래의 코드는 위 코드의 struct를 class로 변경한 코드다.

class MyPoint {
	public int X { get; set; }
	public int Y { get; set; }

	public MyPoint(int x, int y) {
		this.X = x;
		this.Y = y;
	}
}

...

// Reference Type의 동작을 확인
MyPoint a = new MyPoint(10, 20);
MyPoint b = a;

Console.WriteLine("a: ({0}, {1})", a.X, a.Y);  // 실행 결과 : a: (10, 20)
Console.WriteLine("b: ({0}, {1})", b.X, b.Y);  // 실행 결과 : b: (10, 20)

a.X = 80;

Console.WriteLine("a: ({0}, {1})", a.X, a.Y);  // 실행 결과 : a: (80, 20)
Console.WriteLine("b: ({0}, {1})", b.X, b.Y);  // 실행 결과 : b: (80, 20)

class의 경우 a의 값을 b에 대입하면 (10, 20)이라는 값을 가진 객체를 가리키는 참조가 b에 대입되어 a와 b는 같은 객체를 참조한다. 그리고 a.X = 80이 실행되면 a를 통해 (10, 20) 값을 가진 객체가 (80, 20)으로 변경된다. b에도 같은 참조가 저장되어 있으므로 b.X를 참조하면 80이 얻어진다.

Value Type과 Reference Type이 동작하는 방식의 차이는 대입할 때뿐만 아니라 객체를 메서드의 인수에 넘겨줄 때도 마찬가지이다. 구조체(Value Type)에는 값 자체가 복사되어 메서드에 전달되므로 메서드 안에서 객체의 값을 변경해도 호출한 쪽에서는 그렇게 변경된 것에 영향을 받지 않는다. 그러나 클래스(Reference Type)는 참조형 객체를 인수로 지정하면 객체를 가리키는 참조가 복사되어 메서드에 전달된다. 따라서 이렇게 넘겨받은 객체의 값을 메서드 안에서 변경하면 호출한 쪽의 객체가 그 참조를 통해 변경된다.

C#에서 값형과 참조형이라는 두 가지 형으로 구분된 이유는 프로그램이 실행되는 효율과 메모리 공간을 사용하는 효율 때문이다. 큰 객체에는 참조형이 유리하고 작은 객체에는 값형이 유리하다.

profile
Unity Developer

0개의 댓글