static 변수와 일반 변수의 차이와 접근 방식을 이해하는 것이 중요합니다. 특히, static 변수는 클래스 단위에서 관리되고, 일반 변수는 객체(인스턴스) 단위에서 관리되므로, 서로의 접근 방식이 다릅니다. 이번 글에서는 static 변수와 일반 변수의 차이를 이해하고, 접근 방식을 정리해보겠습니다.
static 변수와 일반 변수의 차이
static 변수는 클래스 소속
public class Example
{
public static int StaticValue = 100; // static 변수
}
StaticValue는 Example 클래스 자체에 속해 있으며, 객체를 만들지 않고 접근해야 합니다.
Example.StaticValue = 200; // 클래스 이름으로 접근 가능
이러한 이유로, 객체 (instance) 를 통해 접근하려고 하면 오류가 발생합니다.
Example ex = new Example();
ex.StaticValue = 300; // 오류 발생 (인스턴스를 통한 접근 불가)
일반 변수는 인스턴스 소속
public class Example
{
public int InstanceValue = 200; // 일반 변수
}
InstanceValue 는 개별 객체( instance ) 마다 존재하기 때문에, 객체를 생성해야만 접근할 수 있습니다.
Example ex = new Example();
ex.InstanceValue = 300; // 객체를 통해 접근 가능
따라서 클래스 이름을 통해 접근하려고 하면 오류가 발생합니다.
Example.InstanceValue = 400; // 오류 발생 (클래스 이름으로 접근 불가)
static 변수와 일반 변수의 메모리 구조
C#에서는 변수의 종류에 따라 메모리에서 관리되는 방식이 다릅니다.
static 변수 | static 메모리 영역 | 프로그램 실행 중 단 하나만 존재 |
일반 변수 | 힙(Heap) | 인스턴스가 생성될 때마다 개별적으로 생성 |
지역 변수 | 스택(Stack) | 함수 실행 시 생성되고, 종료 시 삭제 |
즉, static 변수는 프로그램이 실행될 때 한 번만 생성되고, 인스턴스와 관계없이 유지됩니다. 반면, 일반 변수는 객체가 new로 생성될 때마다 새로운 값이 할당됩니다.
static 과 instance 의 접근 방식 차이
static 변수는 인스턴스에 속하지 않고, 클래스 자체에서 관리됩니다.
따라서 static 변수는 클래스 이름을 통해서만 접근할 수 있습니다.
public class Example
{
public static int StaticValue = 100;
}
// 클래스 이름으로 접근 가능
Example.StaticValue = 200;
그러나 객체를 통해 static 변수에 접근하면 오류가 발생합니다.
Example ex = new Example();
ex.StaticValue = 300; // 오류 발생
static 함수는 클래스 단위에서 실행되므로, 특정 인스턴스를 참조할 방법이 없습니다.
public class Example
{
public int InstanceValue = 200;
public static void PrintValue()
{
Console.WriteLine(InstanceValue); // 오류 발생
}
}
InstanceValue 는 인스턴스가 생성된 후에만 존재하지만, PrintValue() 는 클래스 레벨에서 실행되므로 접근할 수 없습니다.
올바른 방법은 객체를 전달하여 사용하는 것입니다.
public class Example
{
public int InstanceValue = 200;
public static void PrintValue(Example obj)
{
Console.WriteLine(obj.InstanceValue); // 인스턴스를 통해 접근 가능
}
}
Example ex = new Example();
Example.PrintValue(ex); // 올바른 사용
정리
static 변수는 클래스가 관리하며, 프로그램 실행 중 한 번만 메모리에 올라갑니다.
static 변수는 특정 인스턴스가 아니라 클래스 자체에서 접근해야 합니다.
static 함수나 변수는 static 메모리 공간에서 관리되므로, 스택이나 힙 메모리에 있는 일반 변수나 함수에 직접 접근할 수 없습니다. 하지만, 인스턴스를 통해 접근할 수 있습니다.
따라서, 일반 변수나 함수는 인스턴스화된 객체를 통해 접근해야 합니다.
한가지 첨언하자면...
static 은 여러 장점을 가지고 있지만 동시에 단점도 존재합니다.
그리고 이러한 단점을 singleton 이라는 특이한 패턴으로 극복했습니다.
public static GameManager Instance;
static 이면서도 객체를 저장하고 있는 형태입니다.
클래스에서 관리되지만, Instance 는 객체이기 때문에 힙이나 스택에 있는 데이타를 가리키게 됩니다.
따라서 전역처럼 접근 가능하면서도 instnace 의 기능도 가지고 있는 특이한 존재입니다.
'C#' 카테고리의 다른 글
필드 (Field) 와 속성 (Property) 에 대해서 (0) | 2025.03.11 |
---|---|
event Action 을 활용한 이벤트 처리 (0) | 2025.03.11 |
Delegate 이해하기 (0) | 2025.03.10 |
전역으로 관리되는 class 를 만들고 싶을 때 (singleton) (0) | 2025.03.10 |
Vector3 pos = new Vector3() 의 이해와 대안 (0) | 2025.03.10 |