값타입과 참조타입의 메모리 할당 시점
1. 값 타입 ( Valuse Type )
- 대표 : int , float , struct , bool 등..
- Stack 영역에 주로 저장된다.
할당 시점
- 변수를 선언할 때 곧바로 스택에 공간이 잡힌다.
- 값 타입은 블록 범위가 끝난 시점에 사라진다.
int x = 10; // 스택에 바로 10이 저장됨
2. 참조 타입 ( Reference Type )
- 대표 : class , array , string 등..
- Heap 영역에 실제 데이터가 저장된다.
- Stack 에는 Heap 을 가리키는 참조 ( 주소값 ) 만 저장된다.
할당 시점
- new 키워드를 만나는 순간 Heap 에 메모리가 잡힌다.
- 참조 타입은 더 이상 사용되지 않아서 자동으로 할당 해제된다. ( GC , Garbage Collector )
MyClass obj = new MyClass();
// 스택에는 obj 참조 변수 저장,
// 힙에는 MyClass 객체가 생성됨
정적 ( Static )
Static 은 특수한 키워드이다.
"Staic 은 정적이다" 라는 의미이며, 프로그램 전체에서 딱 하나만 존재하는 고정된 공간을 만든다는 뜻이다.
다른 객체가 최초로 호출하는 시점에 메모리의 대표적인 구성인 코드, 데이터, 힙, 스택 영역 중에서 데이터 영역에 할당된다.
할당되는 위치도 특이하지만 신기하게도 한번 할당이 완료된 시점, 즉 프로그램이 실행되는 동안 자동으로 할당 해제되지 않는다.
동적이 아니라 정적이라 함은 메모리에 항상 상주하는 상태로 있다는 걸 의미한다.
메모리에 항상 상주하기 때문에 인스턴스를 중복해서 만들 필요가 없고 설령 생성이 가능하다고 하더라도 static 의 사용 의의를 지키지 않게 된다. 그렇기 때문에 그동안 사용했던 public 또는 private 생성자는 사용할 수 없다.
프로그램 어디에서나 전역적으로 접근할수 있는 장점이 있다. ( Static 선언 시 '프로그램 전역' 에서 호출 가능 )
프로그램을 관리하는 중추적인 역할을 하는 데이터를 static 으로 선언하거나, 편리한 데이터 참조와 호출을 위해 사용한다.
class Game
{
public static int maxPlayer = 8;
}
Console.WriteLine(Game.maxPlayer);
// 객체 없이 사용 가능하다
Static 변수 vs 인스턴스 변수
| 구분 | Class 멤버 변수 | Static 변수 |
| 소속 | 객체(인스턴스) 별도 공간 | 클래스 전체 ( 정적 공간 ) |
| 메모리 | 객체마다 별도 생성 | 프로그램 전체에서 하나 |
| 접근 방식 | 객체명.변수 | 클래스명.변수 |
주의사항
클래스 자체를 Static 으로 선언하면 인스턴스 생성이 불가능하다.
1. 인스턴스 생성 불가
static class MyClass { }
MyClass obj = new MyClass();
// 컴파일 에러
- new 키워드로 객체 생성 불가
- 따라서 Heap 에 객체가 생성되지 않음
- 정적으로 선언된 클래스는 정적 변수 혹은 정적 메서드만 가질수 있다.
2. 모든 멤버는 static 이어야 함
static class Utils
{
public static int Add(int a, int b) => a + b;
}
int result = Utils.Add(3, 5);
// 인스턴스 없이 바로 호출 가능
- static 클래스 안에는 인스턴스 멤버 ( 필드 , 메서드 ) 를 둘 수 없다.
- 전부 클래스 단위로만 공유되는 멤버가 된다.
3. 상속 불가
- static 클래스는 다른 클래스를 상속받을수 없다.
- 다른 클래스가 static 클래스를 상속할수 없다.
4. static 생성자 ( static Constructor ) 호출 시점
- 클래스의 어떤 static 멤버 ( 필드 , 메서드 등 ) 에 처음 접근할 때
- 또는, 그 클래스의 인스턴스를 처음 생성할 때
- 최초 1회만 자동 실행된다
static 을 사용하는 경우
1. 공통 기능
- 인스턴스 생성할 필요 없이 모두가 공유해서 쓰는 함수일 때
2. 전역적으로 공유되는 값 ( 공용 데이터 )
- 모든 인스턴스가 똑같이 써야 하는 값
- 예시 : 게임에서 최대 플레이어 수 같은 고정 값
class GameConfig
{
public static int MaxPlayers = 4;
// 모든 곳에서 동일하게 공유한다
}
3. 상태가 단 하나만 필요한 경우 ( Singleton )
- 프로그램 전체에서 딱 한번만 관리되는 자원
- 로깅 시스템, 설정값 캐싱 등
정리
- static class 는 인스턴스 생성 불가능
- 멤버도 전부 static 이어야 한다.
- 주로 전역적으로 공유되는 기능 모음 용도로 사용한다.
- static 생성자는 class 에 instance 가 생성되거나
- 또는 static 으로 선언된 변수, 메서드를 호출할 때 최초로 1회 선언된다.
사용하는 경우
- 객체마다 달라질 필요 없는 공통 데이터가 있을 때
- 인스턴스 없이도 동작 가능한 도구, 유틸리티 메서드
- 프로그램 전체에서 공유되어야 할 설정값
- 자주 쓰는 유틸리티 기능을 모아놓은 클래스를 정의
참고자료
static
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/static
'⭐C Sharp > 11. 객체 지향' 카테고리의 다른 글
| 추상 클래스 ( Abstract Class ) (0) | 2025.09.28 |
|---|---|
| 인터페이스 ( Interface ) (0) | 2025.09.28 |
| this ( 매개변수 키워드 ) (0) | 2025.09.28 |
| 클래스 ( Class ) (0) | 2025.09.22 |
| 메모리 구조 (0) | 2025.09.22 |