✅ static 필드
자바에서 static 필드는 클래스 수준의 변수로, 해당 클래스의 모든 인스턴스가 공유하는 필드입니다. static 필드는 클래스가 처음으로 로드될 때 초기화되며, 프로그램이 실행되는 동안 메모리에 상주하게 됩니다. static 필드는 JVM의 메모리의 Method Area에 저장됩니다.
정적 변수(즉, 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();와 같은 방식으로 호출할 수 있습니다.
✅ static 필드의 사용
static
멤버는 객체가 생성될 때마다 메모리에 할당되지 않고, 프로그램이 실행되는 동안 메모리에 단 한 번만 할당됩니다. 이로 인해 객체 인스턴스를 생성할 때 발생하는 오버헤드를 줄여줍니다. 또한, static
멤버는 모든 객체 간에 공유되므로 메모리 사용량을 줄일 수 있다는 장점이 있습니다.
- 상수 정의
public class MathUtils { public static final double PI = 3.14159; public static final double E = 2.71828; // ... }
static final
로 선언된 변수는 상수로 취급되어 변경할 수 없습니다. 이러한 상수는 클래스 수준에서 정의되며, 해당 클래스의 모든 인스턴스에서 동일한 값을 가집니다. 상수는 프로그램의 여러 부분에서 공유되는 값을 표현하는 데 사용됩니다.
- 공유 데이터
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()
는 사용자를 추가하고 모든 사용자를 반환하는 메서드입니다.
- 유틸리티 메소드
public class StringUtils { public static boolean isNullOrEmpty(String str) { return str == null || str.isEmpty(); } // ... }
위의 예시에서
StringUtils
클래스는 문자열 관련 유틸리티를 제공합니다.isNullOrEmpty()
는 주어진 문자열이 null이거나 비어있는지 여부를 검사하는 정적 메서드입니다.static
메서드는 특정 클래스에 속하지만 해당 클래스의 인스턴스를 생성하지 않고 호출할 수 있습니다. 이는 특정 작업을 수행하기 위해 객체 인스턴스를 생성할 필요가 없는 경우에 유용합니다.호출방식 메모리 할당 정적메소드(static) 클래스 이름을 통해 호출 Method Area 동적메소드(non-static) 인스턴스를 통해 호출 객체의 Heap영역
- 캐싱
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 메소드의 특징
- 클래스 수준에 속하므로 클래스 이름으로 직접 호출할 수 있습니다. (`MathUtils.add()`와 같이 호출)
- static 메소드는 인스턴스 변수나 인스턴스 메소드에 직접 접근할 수 없습니다. 그 이유는 static 메소드는 인스턴스 생성 없이 호출되므로 인스턴스와 관련된 정보에 접근할 수 없기 때문입니다.
- static 메소드는 다른 static 메소드나 static 변수만 접근할 수 있습니다.
- static 메소드 내에서는 인스턴스 변수나 인스턴스 메소드를 사용할 수 없지만, 인스턴스를 생성하여 해당 인스턴스의 변수와 메소드를 사용할 수는 있습니다.
따라서, static 메소드는 클래스와 관련된 유틸리티 메소드를 구현하거나, 객체 인스턴스와 관계없이 공통적으로 사용되는 메소드를 구현하는 데 유용합니다.
Uploaded by N2T