내일배움캠프 Unity 9기/TIL

[Unity/TIL] - static

song-ssi 2025. 4. 22. 09:59

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 ✅ (같은 어셈블리일 때만)