EdgeSecu

static에 관하여 본문

공부/JAVA

static에 관하여

Edgemine 2025. 5. 17. 16:21

Static vs Instance: Java에서 static과 인스턴스 멤버의 차이

Java에서 static 키워드를 사용하면 클래스 레벨 멤버를, 그렇지 않으면 인스턴스(객체) 레벨 멤버를 정의합니다. 두 가지를 비교해 보겠습니다.


1. static 멤버 (클래스 레벨)

  • 공유: 모든 객체가 하나의 멤버를 공유합니다.
  • 접근 방법: 클래스이름.멤버 형태로 객체 생성 없이 바로 접근할 수 있습니다.
  • 주요 용도:
    • 공통 상태 유지 (예: 전체 인스턴스 개수 카운터)
    • 유틸리티 메서드 (예: Math.max(), Collections.sort())
    • 상수 선언 (예: public static final double PI = 3.14;)
class Counter {
    static int totalCount = 0;  // 클래스마다 하나
    int instanceCount = 0;      // 인스턴스마다 하나

    void increment() {
        totalCount++;
        instanceCount++;
    }
}

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

System.out.println(Counter.totalCount);   // 2
System.out.println(a.instanceCount);      // 1
System.out.println(b.instanceCount);      // 1

2. 인스턴스 멤버 (객체 레벨)

  • 독립적: 각 객체가 자신의 복사본을 가집니다.
  • 접근 방법: 객체참조.멤버 형태로 접근합니다.
  • 주요 용도:
    • 객체별로 상태를 유지해야 할 때
class User {
    String name;            // 인스턴스 필드
    static String group;    // 클래스 필드

    User(String name) {
        this.name = name;
    }
}

User.group = "A";
User u1 = new User("x");
User u2 = new User("y");

System.out.println(u1.name);    // x
System.out.println(u2.name);    // y
System.out.println(User.group); // A

u1.group = "B";                // 그룹 변경
System.out.println(u2.group);   // B (공유됨)

3. static vs non-static 비교 표

구분 static 멤버 인스턴스 멤버
저장 위치 클래스 영역 힙(Heap)
개수 클래스 당 하나 객체 당 하나
접근 방법 클래스이름.멤버 객체참조.멤버
사용 예시 유틸리티, 상수, 공통 상태 객체 상태, 개별 데이터

4. 언제 static을 사용해야 할까?

  • 전체 인스턴스가 공유해야 하는 값이나 기능
  • 인스턴스 생성과 무관한 유틸리티 메서드
  • 변경 불가능한 상수