📌Static

2025. 9. 22. 00:13·⭐C Sharp/11. 객체 지향

값타입과 참조타입의 메모리 할당 시점

 

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
'⭐C Sharp/11. 객체 지향' 카테고리의 다른 글
  • 인터페이스 ( Interface )
  • this ( 매개변수 키워드 )
  • 클래스 ( Class )
  • 메모리 구조
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료형
    unity
    기획
    게임디자인
    유니티
    게임기획
    자료구조
    OOP
    객체지향
    디자인패턴
    c#
    CodingTest
    메모리관리
    algorithm
    gamedesign
    문법
    til
    GitHub
    csharp
    부트캠프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
📌Static
상단으로

티스토리툴바