C#

C# 기초부터 고급까지 Chapter 1.7. static vs instance 완전정복

Juan_ 2025. 4. 25. 18:52
728x90

📚 Chapter 1.7: static vs instance 완전정복


✅ 이 챕터에서 배울 것

static 키워드는 한 번 선언되면 모든 인스턴스에서 공유,
instance각각의 객체가 독립적인 데이터 보유

→ 이 차이를 메모리 구조 + 코드 예제 + 설계 기준으로 정리해준다!
  • static 키워드의 의미와 위치
  • instance 멤버와의 차이
  • 메모리 구조: 데이터는 어디에 저장되나?
  • 실무에서 static을 언제 쓰고 언제 쓰면 안 되는지

🧠 먼저 용어부터 짚자

용어
static클래스 전체에 속하는 고정 멤버. 인스턴스 생성 없이 사용 가능
instance객체를 만들 때마다 새로 생성되는 멤버. new 키워드 필요

🧪 예제 1: static vs instance 필드 차이

class Counter
{
    public static int StaticCount = 0;   // 모든 객체가 공유
    public int InstanceCount = 0;        // 객체마다 따로 존재

    public void Increase()
    {
        StaticCount++;
        InstanceCount++;
    }
}

Counter a = new Counter();
Counter b = new Counter();

a.Increase();  // Static: 1, Instance: a=1
b.Increase();  // Static: 2, Instance: b=1

Console.WriteLine($"Static: {Counter.StaticCount}");     // 2
Console.WriteLine($"a.InstanceCount: {a.InstanceCount}"); // 1
Console.WriteLine($"b.InstanceCount: {b.InstanceCount}"); // 1
StaticCount클래스 전체 공유,
InstanceCount각 객체마다 따로 관리

🔍 메모리 구조 차이 (정리도)

구분저장 위치생명주기특징
staticData Segment (영구 영역)프로그램 종료 시까지 유지공유 자원
instanceHeap (힙 메모리)객체가 살아있는 동안만객체 고유 상태 저장

✨ static 멤버 종류

class MathUtil
{
    public static double Pi = 3.1415;

    public static double Square(double x)
    {
        return x * x;
    }
}

// 사용 시 객체 필요 없음!
double result = MathUtil.Square(5);
static 메서드와 필드는 객체 없이 사용 가능!

🚫 instance 없이 static만 쓰면 위험한 경우

예시설명
상태를 저장해야 할 때static 변수로 다 처리하면 동시성 문제, 의도치 않은 공유 발생
DI(의존성 주입) 환경static은 DI 컨테이너로 관리 못 함 → 테스트 어려움
유닛 테스트static은 mocking이 어려움 (테스트 코드 작성 곤란)

💡 실무 설계 기준

조건추천 키워드
계산, 유틸성 기능 (상태 없음)static
상태가 있는 클래스 (데이터 유지)instance
싱글톤 객체static or Lazy 패턴
프로그램 전체에서 단 하나static + readonly 조합 추천

✅ const vs static readonly 차이

public const double Pi = 3.14; // 컴파일 시 상수 고정됨
public static readonly string AppName = "장선생 앱"; // 런타임 초기화 가능
항목conststatic readonly
변경 가능 여부절대 불변생성자에서 설정 가능
초기화 시점컴파일 시런타임 시
사용 위치필드만 가능생성자 or 필드

💥 장선생의 실전 꿀팁

  • 유틸 클래스, 설정 값 → static 추천
  • 의존성이나 상태 변경되는 객체 → instance로!
  • static 클래스는 상속 안 됨!
  • 객체 없이 호출하려고 static 남발하면 유지보수 지옥 된다!
  • "기능 중심이냐, 상태 중심이냐" 로 판단하라

✅ 요약 정리

구분staticinstance
공유 여부클래스 전체 공유각 객체마다 개별
메모리 위치Data 영역Heap
객체 필요 여부
사용 용도계산, 설정 등사용자 상태, 개별 정보 등

📘 다음 챕터 예고 🎓

Chapter 1.8: 객체지향 핵심 – 상속, 다형성, 캡슐화 완전정복!

OOP의 3대 원칙을 진짜 코드 예제로,
"왜 필요한가?", "어디서 써야 하나?"까지 실무 관점으로 알려준다!
728x90