C# 메모리 관리 – 스태틱 클래스 Static Class

C# 메모리 관리 – 스태틱 클래스 Static Class

memory management

 

스태틱 Static

메모리 관리 강좌의 마지막 부분을 살펴보겠습니다. 다시 말씀 드리지만, 여러분이 C 언어의 배경 지식이 있는 경우 C#에서는 다르기 때문에, 여러분이 알고 계신 스태틱static에 사용방법에 대한 내용을 잊으시기 바랍니다.

.NET에서 스태틱 변수는 High Frequency Heap이라 불리는 힙heap의 특별한  부분에 저장됩니다.

이전 강좌에서 언급했듯이, 인터넷의 여러 튜토리얼에서 스태틱 변수를 사용하는 것을 보고, 프로그래밍을 처음 시작하시는 분들은 그 쉬운 사용법에 매료됩니다. 하지만 대부분의 튜토리얼에서 스태틱 변수의 장점과 위험성에 대해서는 자세히 설명하지 않습니다. 이번 강좌에서 스태틱 객체가 어떤 것이며, 어떻게 사용하고, 사용해야 하는 경우와 사용하지 말아야 하는 경우에 대해서 살펴보겠습니다.

 

스태틱 클래스 Static Class

스태틱 클래스는 객체 인스턴스화를 하지 않는 클래스이기 때문에, 스태틱 클래스의 객체를 생성할 수 없습니다.

그 결과로, 객체가 한 개만 존재하게 됩니다. 방금 스태틱 클래스의 인스턴스가 없다고 설명한 부분이 혼란스러울 수도 있는데, 프로그램이 이 객체를 힙 내의 메모리에 할당하고 사용자에게는 인스턴스 생성을 허용하지 않습니다.

스태틱 객체들은 이 객체들이 처음 호출될 때 생성되고 프로그램이 종료될 때 해제됩니다 (또는 크래쉬crash가 발생했을 때..).

public static class GameManager
{
    public static int score;  
    public static float amountOfTime;
}

위의 GameManager 타입의 객체는 아래 스크립트 내용과 같이 선언할 수 없습니다.

GameManager GM = new GameManager();

위의 코드는 오류를 발생시킵니다.

스태틱 클래스의 멤버는 간단히 아래와 같은 방법으로 접근 가능합니다.

GameManager.score = 10;

게임 내에서 언제 어디서나 위와 같은 방식으로 접근이 가능합니다. 스태틱 클래스 또는 스태틱 멤버는 모든 파일에서 접근이 가능하며 실행되는 프로그램과 수명이 같습니다.

 

스태틱 클래스를 사용하는 예

새 씬이 로딩되면, 이전 씬에서 사용했던 모든 변수들이 제거됩니다. 점수 같은 변수를 보존하고 싶을 때, 아래 API와 같은 기능이 필요합니다.

DontDestroyOnLoad(score);

스태틱 클래스를 사용할 때 장점 중 하나는 그 수명에 있습니다. 스태틱 클래스는 죽지 않기 때문에, 씬이 새로 로드되더라도 점수를 유지하고 싶을 때 스태틱 클래스를 사용할 수 있습니다. 아래 예제에서는 씬이 종료되는 시점에 스태틱 멤버에 점수 값을 저장하고, 씬이 새로 시작될 때 저장했던 값을 읽어옵니다.

씬이 종료될 때:

if(newLevel)
{
    GameManager.score = tempScore;
    Application.LoadLevel(nextLevel);
}

그리고 레벨이 새로 시작될 때:

void Start()
{
    scoreTemp = gameManager.score;
}

이 예제에는 작은 트릭이 있는데, GameManager.score 를 끝날 때까지 사용하지 않는다는 것 입니다.

레벨이 10개인 게임이 있다고 가정해보겠습니다. 각 레벨에서 최대 200 포인트를 얻습니다.

한 유저가 이 게임을 한 번에 끝내고 2000점을 얻었습니다.

다른 유저는 여러번 플레이하고 5000점을 얻었습니다.

이경우, 두 번째 유저는 첫 번째 유저보다 게임을 잘 하지 못했지만, 같은 레벨을 여러번 시도해서 더 많은 점수를 쌓았습니다. 만약 여기에서,  스태틱 변수에 점수를 전달하기 위해서, 다음 레벨이 로드될 때까지 대기 한다면, 값을 읽을 때 레벨을 진행하는 동안에 쌓았던 점수들은 취소됩니다.

게임을 종료할 때, 스태틱 클래스에 저장된 데이터는 저장 파일로 전달될 수 있습니다.

스태틱 클래스와 스태틱 변수는 프로그램에서 처음으로 호출될 때 할당됩니다. 스태틱 클래스는 이 클래스가 가진 변수나 함수에 접근을 하지 않는 경우에는 생성이 되지 않습니다.

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

 

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다