자바에서 static 필드는 클래스 수준의 변수로, 해당 클래스의 모든 인스턴스가 공유하는 필드입니다.
static 필드는 클래스가 처음으로 로드될 때 초기화되며, 프로그램이 실행되는 동안 메모리에 상주하게 됩니다.
다른 말로하면, static 필드는 클래스의 인스턴스를 생성하지 않아도 접근할 수 있습니다.
다음은 static 필드의 사용 예시와 함께 자바 코드를 통해 상세하게 설명하겠습니다.
public class Counter {
private static int count = 0;
public Counter() {
count++;
}
public static int getCount() {
return count;
}
}
위의 코드에서 Counter 클래스는 static 필드 count와 생성자, 그리고 static 메서드 getCount()를 가지고 있습니다.
count는 private static int count = 0;라는 선언으로 정의되었습니다. 이 필드는 클래스 레벨에서 공유되므로 Counter 클래스의 모든 인스턴스가 동일한 count 값을 공유합니다. private으로 선언되었으므로 외부에서 직접 접근할 수 없고, getCount() 메서드를 통해 접근해야 합니다.
Counter 클래스의 생성자는 인스턴스가 생성될 때마다 count 값을 증가시킵니다. public Counter() { count++; }라는 생성자는 객체가 생성될 때마다 count 값을 증가시킵니다.
getCount() 메서드는 count 값을 반환합니다. 이 메서드는 static으로 선언되었으므로 클래스 이름을 통해 접근할 수 있습니다. 예를 들어, int totalCount = Counter.getCount();와 같은 방식으로 호출할 수 있습니다.
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
System.out.println("Count: " + Counter.getCount()); // 출력: Count: 1
//class 객체를 안쓰고 class 명만 씀. ^ Counter
Counter c2 = new Counter();
System.out.println("Count: " + Counter.getCount()); // 출력: Count: 2
}
}
위의 Main 클래스에서는 Counter 클래스를 사용하여 두 개의 Counter 인스턴스를 생성합니다. getCount() 메서드를 통해 count 값을 출력합니다. 각각의 인스턴스 생성마다 count 값이 증가되기 때문에, 출력 결과는 Count: 1과 Count: 2가 됩니다.
이를 통해 static 필드는 클래스 레벨에서 공유되며, 모든 인스턴스가 동일한 값을 참조한다는 점을 알 수 있습니다.
자바 클래스의 static 필드는 여러 가지 상황에서 유용하게 사용될 수 있습니다. 다음은 static 필드가 사용되는 몇 가지 일반적인 예시와 함께 샘플 코드를 제시합니다:
1 . 상수 정의
public class MathUtils {
public static final double PI = 3.14159;
public static final double E = 2.71828; //상수 정의 할 때 이렇게 씀. ex) PI, E
// ...
}
위의 예시에서 MathUtils 클래스는 수학 관련 유틸리티를 제공합니다. PI와 E는 상수(static final) 필드로 정의되어 원주율과 자연 상수 값을 저장합니다.
2 . 공유 데이터
public class UserManager {
private static List<User> users = new ArrayList<>(); //자료 구조 정의한게 컬렉션
public static void addUser(User user) {
users.add(user);
}
public static List<User> getAllUsers() {
return users;
}
// ...
}
위의 예시에서 UserManager 클래스는 사용자 관리를 담당합니다. users라는 static 필드는 모든 인스턴스가 공유하는 사용자 목록을 저장합니다. addUser()와 getAllUsers()는 사용자를 추가하고 모든 사용자를 반환하는 메서드입니다.
3 . 유틸리티 메서드
ex) System.out.println() 얘가 유틸리티 메서드
public class StringUtils {
public static boolean isNullOrEmpty(String str) {
return str == null || str.isEmpty();
}
// ...
}
위의 예시에서 StringUtils 클래스는 문자열 관련 유틸리티를 제공합니다. isNullOrEmpty()는 주어진 문자열이 null이거나 비어있는지 여부를 검사하는 정적 메서드입니다.
4 . 캐싱
public class CacheManager {
private static Map<String, Object> cache = new HashMap<>();
public static void put(String key, Object value) {
cache.put(key, value);
}
public static Object get(String key) {
return cache.get(key);
}
// ...
}
위의 예시에서 CacheManager 클래스는 캐시 관리를 위한 유틸리티를 제공합니다. cache라는 static 필드는 키-값 쌍을 저장하는 맵입니다.
put()과 get() 메서드는 캐시에 값을 넣거나 가져오는 역할을 합니다.
이러한 예시를 통해 static 필드는 클래스 수준에서 공유되며, 모든 인스턴스에서 동일한 값을 참조하는 데 사용될 수 있다는 것을 알 수 있습니다.
이는 공통 데이터, 상수, 유틸리티 메서드, 캐싱 등 다양한 상황에서 유용하게 활용될 수 있습니다.