XR 플밍 - 4. 객체지향 프로그래밍과 데이터 구조 - (1-2) 메모리, 값 타입과 참조 타입 (3/24)

이형원·2025년 3월 24일
0

XR플밍

목록 보기
21/215

C#의 경우에는 C와 C++과 달리 메모리 관리를 자동으로 해 준다. 하지만 게임 프로그래밍에서는 성능 최적화를 위해 컴퓨터 내부적으로 메모리가 어떻게 사용되는지 이해할 필요가 있다.

1. 메모리(Memory)

메모리란, 프로그램을 처리하기 위해 필요한 정보를 저장하는 기억장치이다.
프로그램은 메모리에 저장한 정보를 토대로 명령들을 수행한다.

2. 메모리의 구조

프로그램은 효율적인 메모리 관리를 위헤 메모리 영역을 구분한다.
데이터는 각 역할마다 지정되는 영역을 달리하여 접근범위, 생존범위 등을 관리한다.

  • 코드 영역

실행 가능한 프로그램 코드가 저장되는 영역이다. 프로그램의 시작 시점에 메모리에 로드되며, 읽기 전용의 형태로 데이터가 저장된다.

  • 데이터 영역

정적변수가 저장되는 영역으로, 프로그램 시작시 할당되며 종료시 삭제된다.

  • 스택 영역

함수와 관련된 지역변수와 매개변수가 저장되는 영역으로, 후입선출 구조로 저장 및 삭제가 진행된다.
*후입선출 : 스택이 위로 누적되는 상황에서 제일 위쪽의 스택부터 처리하는 방식

프로그램은 스택구조를 통해 함수에서 사용한 데이터들을 효율적으로 관리한다.


* 힙 영역

클래스 인스턴스가 저장되는 영역이다.
인스턴스를 생성시 할당되며 더이상 사용하지 않을 시 자동으로 삭제된다.
더이상 사용하지 않는 인스턴스는 가비지 컬렉터가 특정 타이밍이 수거해 간다.

ex) 몬스터가 타격을 맞을 때 바로 없어지면 안되고, 몬스터의 HP가 0이 되면 몬스터가 삭제되는 방식

3. 메모리의 할당과 해제(저장과 삭제)

메모리가 할당되는 방식

-값 타입

메모리에 실제 값을 저장하는 것으로, 값이 전달될 때 실제 데이터가 복사되어 전달된다.
(스택영역에서의 저장방식)

-참조 타입

데이터가 힙 메모리에 저장되고 변수에는 데이터가 저장된 힙 메모리의 주소를 저장한다.
값이 전달될 때 변수에 저장된 힙 메모리의 주소가 복사된다.
(힙 영역에서 데이터 저장->스택 영역에서 주소를 포함한 변수가 저장됨)

앞선 프로그래밍 기초에서 ref와 같은 것을 언급하며 값 형식과 참조 형식에 관해 얘기한 바가 있다. 참조를 하지 않은 값은 실제로 변경이 불가능하다는 사실을 기억하고 있을 것이다.

여기서 이제 class에 관한 것을 배웠으니, class와 struct를 이용하여 값 형식과 참조 형식에 대해 알아보고자 한다.

4. 값 타입과 참조 타입 알아보기 - 클래스(class)와 구조체(struct)의 차이 비교

클래스는 기본적으로 참조 형식이다. 왜냐하면 하나의 기능을 들고 있는 클래스는 용량이 크기에 스택 영역에 일일히 복사하면서 사용하기 힘들기 때문이다.

클래스와 구조체를 비교해 보기 위해 아래와 같이 코드를 작성해 보자.

class Student		// 클래스의 선언
{
    public string name;
    public int age;
}

struct StudentData		// 구조체의 선언
{
    public string name;
    public int age;
}

이와 같이 작성하고 메인에서 호출해보자.

4.1) new의 선언

  • 클래스는 참조방식이기 때문에 new로 만들어주지 않으면 선언이 불가능하다.
  • 반면에 구조체는 값 방식이기 때문에, new로 선언해주지 않아도 문법 오류가 발생하지 않는 걸 볼 수 있다.

4.2) 값의 참조

메인에 이와 같이 작성해보자.

static void Main(string[] args)
{
    Student student = new Student();
    student.name = "김전사";
    student.age = 20;

    Student anotherStudent = student;
    student.age = 80;
    Console.WriteLine(student.age);
    Console.WriteLine(anotherStudent.age);


    StudentData studentData;
    studentData.name = "김전사";
    studentData.age = 20;

    StudentData anotherStudentData;
    anotherStudentData.age = 80;
    Console.WriteLine(studentData.age);
    Console.WriteLine(anotherStudent.age);
}

student를 다른 변수로 생성하여 age 값을 변화시켰을 때, 각각의 출력을 확인해볼 것이다.
이를 출력해보면 다음과 같이 나온다.

클래스로 선언한 변수의 경우, age의 값을 바꾼 것이 그대로 반영되었고, struct는 값 자체만을 복사한 것이기 때문에 원본 값이 수정되지 않은 것을 확인할 수 있다.

이와 같은 부분에서, 클래스와 구조체의 차이를 알 수가 있다.

  • 구조체는 실제 데이터를 보관하는 용도 (값 형식)
  • 클래스는 가리키는 기능을 참조하는 용도 (참조 형식)

이와 같은 이유로, 클래스와 구조체의 선언에서는 아래와 같은 차이점이 있다는 사실 또한 알게 되었다.

  • 구조체는 그 데이터 자체가 중요할 때 사용한다
  • 클래스는 인스턴스가 중요할 때 사용한다.

이와 같은 차이점을 유념하여, 클래스에 관해 더 공부해보도록 하자.

<참고자료>
(이미지 출처)
https://hackmd.io/@KangMoo/Bk5Z1c_en

profile
게임 만들러 코딩 공부중

0개의 댓글