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 함수는 클래스 단위에서 실행되므로, 특정 인스턴스를 참조할 방법이 없습니다.
여기서 클래스 단위에서 실행된다는 의미는 new 로 인스턴스화 하지 않고 클래스명 자체로 접근한다는 뜻입니다.
public class Example
{
public int InstanceValue = 200;
public static void PrintValue()
{
Console.WriteLine(InstanceValue); // 오류 발생
}
}
InstanceValue 는 인스턴스가 생성된 후에만 존재하지만, PrintValue() 에서는 아직 존재하지 않는 InstanceValue 에 접근하려고 했기 때문에 컴파일 오류가 발생합니다. 따라서 옳바른 방법은 객체를 전달하여 사용하는 것입니다.
public class Example
{
public int InstanceValue = 200;
public static void PrintValue()
{
Example ex = new Example();
// 인스턴스를 통해 접근 가능
Console.WriteLine(ex.InstanceValue);
}
}
static class
class Example 을 보면, 클래스는 static 이 아니여도, 그 안에 멤버 변수나 함수가 static 이면, 그 멤버나 함수는 static 으로 동작합니다. 그러면 static class 로 선언하는게 무슨 소용이 있는 걸까? 라는 생각을 잠시해보게 됩니다.
그렇지만, static class 로 선언하면 그 안에 모든 멤버 변수와 함수는 static 으로 선언해야 하는 강제하는 역할입니다.
public static class Utils
{
public static void Print() { }
public int x; // ❌ 컴파일 에러
}
또한 static class 는 new 로 인스턴스를 만들 수 없습니다.
그래서 주로 Math, Console 같은 시스템 유틸 클래스에서 주로 사용합니다.
함수 안에서 static 변수를 선언하면 오류
C#에서는 다음과 같은 코드를 작성하면 컴파일 에러가 발생합니다
static void Main(string[] args)
{
static int count = 0; // ❌ 컴파일 에러
}
함수는 실행될 때마다 새롭게 호출되므로, 그 안에 static 변수를 만들면, 언제 생성되고 초기화되는지가 불명확해지기 때문에, C# 에서는 문법상 허용하지 않습니다.
마무리
• static 변수, 함수, 클래스는 프로그램 실행 중 한 번만 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 |