📚 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
는 각 객체마다 따로 관리
🔍 메모리 구조 차이 (정리도)
구분 | 저장 위치 | 생명주기 | 특징 |
static | Data Segment (영구 영역) | 프로그램 종료 시까지 유지 | 공유 자원 |
instance | Heap (힙 메모리) | 객체가 살아있는 동안만 | 객체 고유 상태 저장 |
✨ 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 = "장선생 앱"; // 런타임 초기화 가능
항목 | const | static readonly |
변경 가능 여부 | 절대 불변 | 생성자에서 설정 가능 |
초기화 시점 | 컴파일 시 | 런타임 시 |
사용 위치 | 필드만 가능 | 생성자 or 필드 |
💥 장선생의 실전 꿀팁
- 유틸 클래스, 설정 값 → static 추천
- 의존성이나 상태 변경되는 객체 → instance로!
- static 클래스는 상속 안 됨!
- 객체 없이 호출하려고 static 남발하면 유지보수 지옥 된다!
- → "기능 중심이냐, 상태 중심이냐" 로 판단하라
✅ 요약 정리
구분 | static | instance |
공유 여부 | 클래스 전체 공유 | 각 객체마다 개별 |
메모리 위치 | Data 영역 | Heap |
객체 필요 여부 | ❌ | ✅ |
사용 용도 | 계산, 설정 등 | 사용자 상태, 개별 정보 등 |
📘 다음 챕터 예고 🎓
Chapter 1.8: 객체지향 핵심 – 상속, 다형성, 캡슐화 완전정복!
OOP의 3대 원칙을 진짜 코드 예제로,
"왜 필요한가?", "어디서 써야 하나?"까지 실무 관점으로 알려준다!