Unity/기능

[Unity] Class와 Struct

turbulence93 2025. 4. 16. 22:58

기존에는 Struct는 빠르고 Class는 유연하다 정도로 알고 있었는데 그 이유에 대해 조금 더 상세히 알아보았다.

구조체와 클래스 비교표

항목 구조체(struct) 클래스(class)
형식 값 타입 참조 타입
메모리 저장 위치 스택 메모리 힙 메모리
복사 방식 값을 통째로 복사 참조를 복사
속도 메모리 접근 빠름 상대적으로 느림
용도 작고 불변인 데이터 묶음 동작/행동이 있는 복잡한 객체
수정 시 전체 복사/대입 필요 내부 필드 수정

 

위 표를 보면 구조체는 값 타입으로, 클래스는 참조 타입으로 나눠져있다.

이러한 데이터 구조로 인해 구조체의 속도가 떠 빠르다는 걸 알수 있다. 참조 타입은 힙 메모리에 접근하여 참조 과정을 거쳐야하기 때문에 스택 메모리에 직접 접근하는 값 타입에 비해 느리게 되는것이다.

이러한 데이터 형식의 차이는 속도를 제외한 용도에서도 차이를 보인다.
위 표를 다시 한번 보면 구조체는 작고 불변인 데이터 묶음, 클래스는 동작/행동이 있는 객체에 사용한다고 한다.

구조체의 경우 외부에서 접근시 구조체의 데이터 값을 통째로 복사해서 가져오게 된다. 가져온 데이터를 수정하게 되면 복사 된 데이터이기 때문에 이 복사된 내용을 다시 한번 대입하여 수정하여야 한다.
그렇게 때문에 데이터가 크거나 내부 데이터가 자주 변경되게 되면 굉장히 성능이 떨어지게 된다. 
데이터가 크면 통째로 복사하면 당연히 느려지게 되고, 데이터의 수정이 복사-> 대입의 과정을 거치기 때문에 이 역시 굉장히 비효율적인 작업이 되기 때문이다. 그래서 구조체를 주로 아이템 등 데이터의 수정이 잘 일어나지 않는 곳에 사용한다. 수정 작업이 없다면 속도가 빠르기 때문이다.

그렇다면 클래스는 어떻게 동작하기에 유연하다고 하는 것일까? 표에 있는 동작/해동이 있는 객체에 사용하는 것일까?
구조체가 값을 통째로 복사한다면 클래스는 참조를 복사한다. 참조를 복사할 시 복사된 데이터를 수정하면 참조하고 있는 원본 데이터도 같이 수정이 일어난다. 수정이 간편하다는 이야기다. 그렇기 때문에 플레이어와 같이 다뤄야할 데이터가 많고, 실시간으로 데이터가 변화하는 구조에 적합한 것이다. 참조를 통해 현재 필요한 데이터만 접근이 가능하기 때문에 정보량이 많아질수록 구조체에 비해 효율적인 접근이 가능하고 간편한 데이터 수정으로 변화하는 데이터를 쉽게 관리할 수 있다.

이러한 차이가 있음에도 속도가 빠르니까 구조체를 쓰는게 이득일까? 라는 생각을 가진다면 반만 맞는 생각이다.
당장에 프로젝트 규모가 작다면, 혹은 제어해야될 데이터가 적다면 괜찮을 수도 있다. 구조체라고 해서 수정이 안되는것도 아니니 말이다.  

간단한 예시로 player.info.name = Console.ReadLine(); 이라는 같은 코드가 있다고 하자.

이 경우 player 내부의 info 구조체가 name이라는 필드를 가지고 있다면,

직접 접근하여 값을 수정할 수 있고, 동작도 간단하며 성능 면에서도 이점이 있어 보인다. 실제로도 그럴것이다.


하지만 name이 필드가 아니면 프로퍼티라면 어떨까? 
Console.WriteLine(player.info.name)을 출력하면, 우리가 ReadLine()을 통해 입력한 값이 아니라 원본 값을 출력한다. 

구조체의 값 형식 특성상 get을 통해 데이터에 접근하면 원본 값을 복사하고 set에서는 복사본을 수정하기 때문에 원본이 수정되지 않는다. 이는 의도치 않은 결과를 발생 시킨것이다.

 

물론 강제로 필드에 접근하는 구조로 만들어 사용할 수 있지만 이는 OOP 캡슐화 원칙에 어긋나며, 구조가 엉키고 가독성이 낮아지는 원인이 될 수 있다. 이는 다른 개발자와의 협업에서 이해하기 어렵고 신뢰하기 힘든 코드로써 능률 저하에 원인이 될 것이다. 

이러한 공부를 통해 용도에 따라 구조체를 쓸지 클래스를 쓸지 구분할 수 있게 된 시간이었다.