static 이란 ?
- 공통적인 것, 인스턴스 없이 접근할 수 있는 것
더보기
💡 인스턴스란?
"클래스를 기반으로 만들어진 실제 물건(객체)"
Player p1 = new Player();
p1.name = "용사";
p1.hp = 100;
Player p2 = new Player();
p2.name = "도적";
p2.hp = 80;
여기서 p1, p2는 **Player 클래스의 인스턴스(실체, 객체)
클래스 | 설계도, 틀 (예: Player) |
인스턴스 | 그 설계도로 찍어낸 실제 객체 (p1, p2) |
⚠️ static은 인스턴스가 아님!
- static이 붙은 변수나 메서드는 클래스 자체에 속해 있음
- new 키워드로 객체를 만들지 않아도 바로 쓸 수 있음(인스턴스 없이 사용 가능)
class Player
{
public int hp = 100;
public void ShowHP()
{
Console.WriteLine(hp);
}
}
Player p1 = new Player();
p1.ShowHP(); // ✅ 객체를 만들어야 접근 가능
class Game
{
public static string title = "Text RPG";
public static void Start()
{
Console.WriteLine("게임 시작!");
}
}
// 객체 없이 바로 호출 가능
Console.WriteLine(Game.title);
Game.Start();
종류 | 종류static ❌ (인스턴스) | static ✅ (정적) |
필드/변수 | 객체마다 따로 존재 (this.hp) | 모든 객체가 공유 (전역 변수 느낌) |
메서드 | 객체가 있어야만 호출 가능 | 객체 없이 바로 호출 가능 |
사용 시점 | 게임 캐릭터, 몬스터 같은 "실제 존재" | 게임 전체 설정, 도구 메서드 등에 적합 |
객체없이 호출 가능하니까 무조건 static쓰는게 편한거 아니야?
⚠️ 왜 static을 남발하면 안 될까?
1. 데이터가 공유됨 → 여러 객체에서 충돌 위험
class Player
{
public static int hp = 100; // ❌ 모든 플레이어가 HP를 공유함
}
➡ 플레이어 1이 데미지를 입으면 플레이어 2도 같이 체력이 깎임 😨👉
static은 공통 상태를 가질 때만 써야 함.
2. 객체 지향(OOP)의 장점을 못 씀
C#은 객체 지향 언어인데, static을 남용하면 클래스 설계가 전역 함수 집합처럼 되어버림.
Game.Start();
Game.End();
Game.Save();
이건 마치 C 언어 스타일이지, OOP스러운 "객체 간의 상호작용"이 아님.
3. 테스트 & 유지보수 어려워짐
static은 테스트가 어려움.
왜냐하면 상태가 고정돼 있고 바꾸기도 까다로움.
(예: 자동화 테스트에서 한 객체만 바꾸고 싶은데, static이면 다 영향을 받음.)
static 써도 괜찮은 상황
전역 설정 값 | ✅ 예: Game.version |
바뀌지 않는 데이터 (아이템DB 등) | ✅ 예: ItemDB[] |
헬퍼 메서드 | ✅ 예: Math.Max(a,b) |
상태를 안 가지는 기능성 코드들 | ✅ 예: Console.WriteLine() |
static 쓰면 안 좋은 상황
플레이어 정보, 몬스터 같은 "개별 객체" | ❌ 각각의 상태를 가져야 하니까 |
저장/로드 시스템 | ❌ 상태 관리가 중요함 |
전투 로직 등 매번 인스턴스화 필요한 것 | ❌ 유연성이 떨어짐 |
📌 static은 “모두가 공유해야 하는 것”에만 써야 함
개인 상태나 인스턴스가 바뀔 수 있는 것에는 안 쓰는 게 좋음.
Player.totalCount = 2;
여기서 Player는 클래스 이름이야.
C#에서 클래스.변수 이런 식으로 직접 접근하려면, 그 변수는 static으로 선언되어 있어야 해.
static에도 접근한정자를 지정해야 해?
static 멤버도 접근 제한자(public, private 등)를 지정하는 게 아주 중요해!
- public static: 다른 클래스에서 써도 되는 유틸리티 기능/데이터
- private static: 내부에서만 쓰는 설정, 상태값, 캐시 등
🔐 접근 제한자는 static에도 꼭 필요함!
아니면 프로젝트 커질수록 모든 클래스가 마구잡이로 접근해서 💥 혼란 생김
접근 한정자 | 클래스 내부 | 자식 클래스(다른 파일) | 같은 프로젝트의 다른 클래스 |
public | ✅ | ✅ | ✅ |
private | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ❌ |
internal | ✅ | ❌ | ✅ |
protected internal | ✅ | ✅ | ✅ |
private protected | ✅ | ✅ (같은 어셈블리일 때만) | ❌ |
'내일배움캠프 Unity 9기 > TIL' 카테고리의 다른 글
[Unity/TIL] - 애니메이션, 트랜지션 추가하기 / GetComponent (1) | 2025.04.29 |
---|---|
[Unity/TIL] - new로 생성한 객체는 클래스와 동기화 되나요? (1) | 2025.04.23 |
[Unity/TIL] - 오류해결모음 (0) | 2025.04.18 |
[Unity/TIL] - Top-level statements (최상위 문) / namespace(네임스페이스) (0) | 2025.04.16 |
[Unity/TIL] - 네이밍규칙(코딩스탠다드) (0) | 2025.04.15 |