Class의 static 필드(today)

KKH_94·2023년 6월 8일
0

JAVA

목록 보기
19/36

자바에서 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: 1Count: 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 클래스는 수학 관련 유틸리티를 제공합니다. PIE는 상수(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 필드는 클래스 수준에서 공유되며, 모든 인스턴스에서 동일한 값을 참조하는 데 사용될 수 있다는 것을 알 수 있습니다.

이는 공통 데이터, 상수, 유틸리티 메서드, 캐싱 등 다양한 상황에서 유용하게 활용될 수 있습니다.

profile
_serendipity

0개의 댓글