C#에서 값 타입(Value)과 참조 타입(Reference) 이해하기: 더 나은 코드를 작성하는 방법!
요약
본 글은 C#의 값 타입(Value Type)과 참조 타입(Reference Type)의 근본적인 차이점과 메모리 할당 방식을 설명합니다. 구조체와 클래스를 예시로 들어, 값이 복사되는 방식과 포인터가 공유되는 방식을 비교하며 성능 좋은 코드 작성 방법을 제시합니다.
핵심 포인트
- 값 타입은 데이터를 완전히 복사하여 독립적으로 존재합니다.
- 참조 타입은 데이터의 위치를 가리키는 포인터를 공유합니다.
- C#에서 데이터는 스택(Stack)과 힙(Heap)에 저장됩니다.
- 이러한 이해는 메모리 효율적이고 성능 좋은 코드를 작성하는 데 필수적입니다.
안녕하세요, 여러분. 오늘은 값 타입(value type)과 참조 타입(reference type)의 차이점을 가르쳐 드리고, 이러한 변수와 데이터가 메모리에 어떻게 저장되는지에 대한 깊이 있는 분석도 할 예정입니다. 이를 통해 더 성능 좋은 코드를 작성할 수 있게 될 것이며, 또한 변수를 생성할 때 실제로 내부적으로 어떤 일이 일어나고 있는지 아는 것도 좋을 것입니다. 따라서 이 영상의 흐름은 다음과 같습니다. 먼저 값 타입과 참조 타입에 대한 개략적인 작동 방식을 보여드릴 것이고, 그 다음에는 메모리 할당(memory allocation)에 대해 깊이 있게 다룰 것입니다. 그리고 이 부분을 이해한 후에 다시 돌아와서 값 타입과 참조 타입을 사용하는 다양한 사용 사례(use case)와 몇 가지 주의할 점(gotcha)을 더 자세히 살펴보겠습니다. 자, 그럼 값 타입부터 시작해 보겠습니다. 우리에게는 많은 수의 값 타입이 있습니다. 예를 들어 전체 숫자 범위가 있고, 부울(boolean) 값이 있으며, 구조체(struct)도 있습니다. 저는 앞으로 구조체를 사용할 예정인데, 이것이 우리에게 가장 흥미로운 기능을 제공할 것이기 때문입니다. 그래서 제가 미리 하나를 준비해 두었습니다. 코드를 작성하는 것을 보지 않아도 됩니다. 이것은 좌표 구조체(coordinate struct)이며 x와 y를 가지고 있고, 문자열(string)을 오버라이드(override)했기 때문에 출력할 때 실제 값이 예쁘게 표시됩니다. 자, 여기 'a'라는 새 변수를 만들고 new coords로 설정해 보겠습니다. 그리고 여기에 하나와 둘을 추가하고, 다른 변수도 만들어서 'a'에 직접 할당하겠습니다. 이제 이 두 개를 출력해 봅시다. 'a'를 출력한 다음 'b'를 출력하면 1 2, 1 2가 출력되는 것을 볼 수 있습니다. 모두가 추측했겠지만요. 그런데 만약 b를 가져와서 x 값을 예를 들어 66으로 설정한다면 어떻게 될까요? 이것을 실행해 보면 이제 a는 1 2로, 그리고 b는 66과 2로 출력됩니다.
따라서 b를 a에 할당한 후 b의 x 값을 변경했음에도 불구하고 a는 변하지 않았습니다. 이것은 구조체(struct)가 값 타입(value type)이며 자체 데이터를 보유하기 때문입니다. 여기서 b를 a에 할당했을 때 무슨 일이 일어났냐면, 우리는 단순히 그 데이터를 새로운 위치로 복사한 것입니다. 따라서 이제 a와 b는 완전히 분리된 두 개의 데이터 조각일 뿐입니다. 이것이 바로 값 타입이 작동하는 근본적인 방식입니다. 만약 우리가 이 코드를 간단히 클래스(class)로 변경한다면 어떻게 될까요? 무엇을 출력할 것 같나요? 한번 실행해 봅시다. 아, 둘 다 66이네요. 여기서 무슨 일이 일어났냐면요, 먼저 우리의 Coordinates 클래스의 새로운 인스턴스를 만들었습니다. 이것은 참조 타입(reference type)이라는 것을 기억하세요. 다음으로 b라는 새 변수를 만들고 a에 할당했습니다. 만약 이것이 값 타입이었다면 방금 배운 것처럼 데이터를 복사했을 것입니다. 하지만 참조 타입의 경우, 우리가 하는 모든 것은 이 데이터가 어딘가에 저장된 곳을 가리키는 완전히 새로운 포인터(pointer)를 생성하는 것뿐입니다. 그래서 이제 메모리 어딘가에 Coordinates 데이터가 있고, a와 b는 그 데이터에 가리키는 참조일 뿐입니다. 그리고 그 때문에 이 줄까지 내려오면, b.x = 66이 됩니다. 이것들은 모두 같은 데이터를 가리키고 있기 때문에 당연히 우리가 여기서 무엇을 하든 상관없이 (a를 사용하든 b를 사용하든) 정확히 동일한 결과를 얻게 됩니다. 이 두 가지 다른 타입에 대해 너무 깊이 들어가기 전에, 데이터가 실제로 어떻게 그리고 어디에 저장되는지에 대해 이야기해 봅시다. C#에서는 데이터가 스택(stack)과 힙(heap)이라는 두 곳에 저장됩니다. 먼저 스택부터 시작합시다. 스택은 정적 데이터(static data), 또는 다른 말로 컴파일 시간에 크기를 명확하게 알고 있는 데이터를 위한 것입니다. 예를 들어, 정수형(integer)이 32비트를 필요로 한다는 것을 알고 있고, 실수형(double)이 64비트를 필요로 한다는 것을 압니다. 그리고 이 데이터의 크기를 알기 때문에, 우리는 이 메모리 할당을 스택에 쉽고 깔끔하게 저장할 수 있습니다. 예시를 통해 한번 살펴봅시다. 어떻게 작동하는지 더 잘 이해하실 수 있도록요. 좋습니다. 이 줄들을 하나하나 살펴보겠습니다. 미래 매트가 저를 싫어할 것 같네요. 화면에 편집할 부분이 너무 많을 것이고, 시간이 걸릴 테니까요.
미래의 Matt가 저를 싫어할 것 같네요. 화면에 편집할 부분이 너무 많을 것이고, 시간이 걸릴 테니까요. 그래서 첫 번째 줄을 보겠습니다. 여기 'one'이라는 인터뷰가 있고, 할당 값이 12입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube Tarodev (Unity 팁)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기