이번 글에서는 StageData 구조체와 GameData 정적 클래스를 이용해 게임의 스테이지 설정 데이터를 관리하는 코드를 어떻게 구성했는지 설명합니다. 아래 예시 코드를 기준으로 세부 개념을 정리합니다.
public struct StageData
{
public int ballSpeed;
public int blockRow;
public int blockColumn;
public int blockWidth;
}
internal static class GameData
{
public static StageData[] stageData;
public static int StageIndex { get; set; }
public static StageData CurrentStage => stageData[StageIndex];
static GameData()
{
StageIndex = 0;
stageData = new StageData[3]
{
new StageData() { ballSpeed = 5, blockRow = 3, blockColumn = 5, blockWidth = 100 },
new StageData() { ballSpeed = 7, blockRow = 4, blockColumn = 6, blockWidth = 80 },
new StageData() { ballSpeed = 9, blockRow = 5, blockColumn = 7, blockWidth = 60 }
};
}
}
1. 구조체 앞에는 static을 붙일 수 없습니다
StageData는 구조체이기 때문에 static struct StageData처럼 사용하는 것은 허용되지 않습니다. 구조체는 값 타입(Value Type)이며, 값 타입은 인스턴스를 생성해야 실제 값이 존재합니다. 정적 타입(static class)은 인스턴스 생성을 금지하므로 값 타입의 기본 개념과 충돌합니다.
즉, 구조체는 int, float처럼 여러 개의 값을 생성하는 것이 자연스러운 존재이고, 따라서 구조체에 static을 붙이는 것은 문법적으로도 의미적으로도 허용되지 않습니다.
2. static 생성자에는 접근 제한자가 없습니다
GameData의 정적 생성자는 다음과 같습니다.
static GameData()
{
StageIndex = 0;
stageData = new StageData[3] { ... };
}
정적 생성자는 외부에서 호출할 수 없기 때문에 public, private 같은 접근 제한자를 붙일 수 없습니다. C# 런타임이 "해당 클래스에 처음 접근하는 시점"에 자동으로 단 한 번만 실행하도록 설계되어 있기 때문입니다.
따라서 접근 제한자가 아예 존재하지 않으며, 외부에서 호출할 수 없는 성질을 가집니다.
3. static 클래스 안에서는 new 사용이 가능합니다
static 클래스는 인스턴스 생성만 불가능할 뿐, 내부에서 객체를 생성하는 것은 아무 문제 없습니다.
stageData = new StageData[3]
{
...
};
정적 클래스 내부에서 new를 자유롭게 사용할 수 있기 때문에, 정적 데이터 테이블을 초기화하거나 설정 값을 준비하는 작업도 자연스럽게 수행할 수 있습니다.
즉, static 클래스 자체는 new가 불가능하지만, 내부에서 다른 타입을 new 하는 것은 얼마든지 가능합니다.
4. 외부 접근 코드가 길어지는 문제는 자동 속성(=>)으로 해결합니다
정적 배열과 인덱스를 이용하면 다음처럼 코드가 길어집니다.
var speed = GameData.stageData[GameData.StageIndex].ballSpeed;
이 불편함을 줄이기 위해 자동 속성(Getter)을 추가합니다.
public static StageData CurrentStage => stageData[StageIndex];
이제 외부에서는 다음처럼 깔끔하게 접근합니다.
ballSpeedX = GameData.CurrentStage.ballSpeed;
이 방식은 다음과 같은 장점이 있습니다.
- 가독성 향상
- GameData 구조 변경 시에도 외부 코드는 그대로 유지
- 규칙과 로직 분리 강화
마무리
이번 구조에서 핵심으로 기억해야 할 내용은 다음과 같습니다.
- 구조체는 값 타입이므로 static을 붙일 수 없습니다.
- static 생성자는 외부 호출이 불가능하므로 접근 제한자를 사용하지 않습니다.
- static 클래스 내부에서는 다른 객체를 new로 생성하는 것이 가능합니다.
- 자동 속성을 사용하면 외부에서 데이터를 접근할 때 코드가 단순해집니다.
이 구조를 사용하면 스테이지 정보 관리가 훨씬 편해지고, 게임 로직과 데이터가 분리되어 유지보수성이 크게 향상됩니다.
'C#' 카테고리의 다른 글
| C#에서 float 형 random 이 없는 이유와 그래도 필요하다면? (0) | 2025.11.16 |
|---|---|
| Data 관리 클래스를 static 으로 만들어야 하는 이유 (0) | 2025.11.15 |
| Dictionary 에서 구조체를 TValue 로 사용시, 주의할 점 (3) | 2025.07.24 |
| 컬렉션 (Collection) 의 깊이 있는 이해 (feat. IEnumerable, ICollection) (1) | 2025.07.24 |
| Dictionary 정리 : 기초부터 활용까지 (0) | 2025.07.23 |