오늘은 데이터를 정의하는 방식인 구조체(Struct)와 클래스(Class)의 차이와 이 두가지가 메모리에서 어떻게 다루어지는지에 대해 정리해 보겠습니다.
구조체는 여러 개의 변수를 하나로 묶어 새로운 데이터 타입을 만드는 사용자 정의 타입입니다.
클래스와 매우 흡사한 형태를 가지지만, 본질적으로는 값 타입(Value Type)에 해당합니다.
주로 좌표 정보나 간단한 능력치처럼 크기가 작고 단순한 데이터를 묶어 관리할 때 사용하며, 상속이 불가능하다는 특징이 있습니다.
<style>
struct Vector2D
{
public float x;
public float y;
public Vector2D(float x, float y)
{
this.x = x;
this.y = y;
}
public void PrintPosition()
{
Debug.Log("현재 위치: " + x + ", " + y);
}
}
public class StructExample : MonoBehaviour
{
void Start()
{
Vector2D pos1 = new Vector2D(10f, 5f);
Vector2D pos2 = pos1; // 값이 통째로 복사됨
pos2.x = 20f; // pos2를 바꿔도 pos1은 영향받지 않음
}
}
</style>
구조체와 클래스는 데이터를 구성하는 방식은 비슷하나 메모리를 사용하는 원리가 다릅니다.
2, 성능과 효율의 차이입니다.
구조체는 스택 메모리에 할당되므로 할당과 해제가 매우 빠르며 가비지 컬렉터(GC)의 부하를 주지 않습니다.
하지만 데이터의 크기가 커지면 그만큼 복사할 때 비용이 많이 들기 때문에, 데이터가 복잡하고 크기가 크다면 힙 메모리를 활용하는 클래스를 사용하는 것이 성능상 더 유리합니다.
<style>
using UnityEngine;
// 값 타입인 구조체
struct PointStruct { public int x; }
// 참조 타입인 클래스
class PointClass { public int x; }
public class MemoryTest : MonoBehaviour
{
void Start()
{
// 1. 구조체 복사: 값을 복사하므로 독립적임
PointStruct s1 = new PointStruct();
s1.x = 10;
PointStruct s2 = s1;
s2.x = 50;
// s1.x는 여전히 10, s2.x만 50으로 변경됨
// 2. 클래스 복사: 주소값을 복사하므로 데이터 변조 위험이 있음
PointClass c1 = new PointClass();
c1.x = 10;
PointClass c2 = c1; // 주소(참조)만 복사됨
c2.x = 50;
// c1.x와 c2.x 모두 50으로 변경됨 (c1의 데이터가 의도치 않게 변조됨)
// 3. 해결 방법: new를 사용해 메모리에 새로운 공간을 할당해야 함
PointClass c3 = new PointClass();
c3.x = c1.x; // 값만 따로 가져와서 할당
}
}
</style>
프로그램이 실행될 때 메모리는 용도에 따라 여러 영역으로 나뉩니다.

코드(Text) 영역: 프로그램의 실행 코드 자체와 상수들이 저장되는 공간으로, 가장 낮은 주소(Low address)에 위치합니다.
데이터 영역: 전역 변수나 정적(Static) 변수가 저장되는 곳입니다. 이미지가 보여주듯 초기화된 데이터(Initialized data)와 초기화되지 않은 데이터(Uninitialized data)로 세분화되기도 합니다.
힙(Heap) 영역: 사용자가 필요에 의해 런타임에 동적으로 할당하는 공간입니다. 이미지상의 화살표처럼 낮은 주소에서 높은 주소 방향으로 메모리가 할당됩니다. 크기가 가변적이며 가비지 컬렉터가 관리하는 영역입니다.
스택(Stack) 영역: 함수 내의 지역 변수나 매개변수가 저장되는 공간입니다. 높은 주소(High address)에서 낮은 주소 방향으로 할당되어 내려오며, 컴파일 타임에 이미 크기가 결정되는 것이 특징입니다.
힙과 스택 메모리 영역은 서로 마주 보며 메모리를 확장합니다. 힙은 위로, 스택은 아래로 확장되며 두 영역이 만나는 지점이 발생하지 않도록 효율적으로 관리하는 것이 프로그램 안정성의 핵심입니다.
오늘은 Struct에 대한 이해와 Class와의 차이에 대해서 학습했습니다.
Class의 경우 주소를 복사한다라는 개념이 처음에 이해하기 어려웠지만 실제 코드를 작성해보면서 주소 복사의 본질에 대해 이해할 수 있었고 이를 해결하는 방법을 통해 Class의 정확한 사용방법에 대해서 알게된 시간이었습니다.