문제의 역사:
자바의 처음부터 클래스의 정적 멤버 개념이 존재했으며, 인스턴스 멤버와는 구별됩니다 — 이러한 변수는 객체가 아닌 클래스 수준에 저장됩니다. 이를 통해 클래스의 모든 인스턴스 간 데이터를 공유하거나 상수 및 서비스 구조를 사용할 수 있습니다.
문제:
정적 필드의 주요 목표는 클래스의 모든 객체에 대한 데이터를 제공하거나 단일 접근 지점을 구현하는 것입니다. 그러나 static을 잘못 사용하면 전역 상태, 데이터 경합 및 테스트 문제와 관련된 찾기 어려운 버그가 발생할 수 있습니다.
해결책:
정적 필드는 static 키워드를 사용하여 선언됩니다:
public class Counter { public static int globalCount = 0; public Counter() { globalCount++; } }
각 인스턴스가 생성될 때마다 카운터가 증가하고, 값은 Counter.globalCount를 통해 접근할 수 있으며, 객체에 무관합니다.
주요 특징:
객체를 통해 정적 필드에 접근할 수 있습니까, 아니면 클래스 이름을 통해서만 해야 합니까?
네, 구문은 객체를 통해 정적 필드에 접근하는 것을 허용하지만, 이는 가독성을 떨어뜨리고 때때로 혼란을 초래할 수 있습니다. 클래스 이름을 통해 항상 접근하는 것이 좋습니다.
Counter c = new Counter(); System.out.println(c.globalCount); // 작동하지만 권장하지 않음
정적 필드는 비공개일 수 있습니까?
네, 접근 수준은 전혀 제한되지 않습니다. 비공식 정적 필드는 종종 공개 정적 메서드와 함께 사용됩니다 (예: Singleton):
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
정적 필드를 비정적에 따라 값을 초기화하려고 하면 어떤 일이 발생합니까?
이러한 코드는 컴파일되지 않습니다. 비정적 필드는 정적 필드 이후에 초기화되기 때문입니다. 정적 필드는 직접적으로 비정적을 참조할 수 없습니다.
대형 애플리케이션에서 사용자에게 특정한 캐시된 데이터를 저장하기 위해 정적 필드가 사용됩니다.
장점:
단점:
상수(예: 오류 코드 또는 표준 매개변수)를 저장하기 위해 public static final String을 사용합니다.
장점:
단점: