본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(60) - static 키워드의 활용과 주의점

by 머니테크리더 2025. 3. 26.
반응형

static 키워드 활용과 주의점

 

🔖 INDEX

     

     

    static 키워드란?

    자바에서 static 키워드는 클래스 레벨에서 공유되는 필드, 메서드, 블록, 내부 클래스 등에 사용되며, 객체의 인스턴스가 아닌 클래스 자체에 속하는 멤버를 정의할 때 사용됩니다. 즉, 모든 인스턴스가 동일한 static 멤버를 공유하게 됩니다.

     

    static 키워드의 주요 활용법

    static 변수 (클래스 변수)

    모든 인스턴스가 공유하는 변수로, 클래스 로딩 시 한 번만 생성됩니다.

    class Counter {
        static int count = 0; // 모든 객체가 공유하는 변수
        
        Counter() {
            count++; // 객체가 생성될 때마다 증가
        }
        
        void printCount() {
            System.out.println("현재 count 값: " + count);
        }
    }
    
    public class StaticVariableExample {
        public static void main(String[] args) {
            Counter c1 = new Counter();
            Counter c2 = new Counter();
            Counter c3 = new Counter();
            
            c1.printCount(); // 출력: 현재 count 값: 3
        }
    }

    주의점: static 변수는 모든 인스턴스가 공유하기 때문에, 동기화 없이 여러 스레드에서 접근하면 동시성 문제가 발생할 수 있습니다.

     

    static 메서드 (클래스 메서드)

    객체 생성 없이 호출할 수 있는 메서드로, static 변수만 접근 가능합니다.

    class MathUtil {
        static int square(int x) {
            return x * x;
        }
    }
    
    public class StaticMethodExample {
        public static void main(String[] args) {
            int result = MathUtil.square(5); // 객체 생성 없이 호출
            System.out.println("5의 제곱: " + result); // 출력: 5의 제곱: 25
        }
    }

    주의점: static 메서드는 인스턴스 변수나 인스턴스 메서드를 직접 참조할 수 없습니다. 따라서, 내부에서 this 키워드를 사용할 수 없습니다.

     

     

     

    static 블록 (정적 초기화 블록)

    클래스가 로딩될 때 한 번 실행되며, static 변수를 초기화하는 데 주로 사용됩니다.

    class DatabaseConfig {
        static String URL;
        
        static {
            URL = "jdbc:mysql://localhost:3306/mydb";
            System.out.println("데이터베이스 URL 설정 완료");
        }
    }
    
    public class StaticBlockExample {
        public static void main(String[] args) {
            System.out.println("DB URL: " + DatabaseConfig.URL);
        }
    }

    주의점: static 블록은 클래스가 처음 로딩될 때 한 번만 실행됩니다. 따라서 복잡한 초기화 작업을 수행하면 애플리케이션 시작 속도가 느려질 수 있습니다.

     

    static 내부 클래스

    정적 내부 클래스는 외부 클래스의 인스턴스 없이 사용 가능합니다.

    class OuterClass {
        static class StaticNestedClass {
            void display() {
                System.out.println("정적 내부 클래스의 메서드 실행");
            }
        }
    }
    
    public class StaticNestedClassExample {
        public static void main(String[] args) {
            OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
            nested.display();
        }
    }

    주의점: 정적 내부 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없습니다.

     

    static 키워드 사용 시 주의점

    1. 메모리 사용 문제: static 변수는 프로그램 종료 시까지 메모리에 유지되므로, 불필요한 사용은 메모리 누수를 초래할 수 있습니다.
    2. 동시성 문제: 여러 스레드가 static 변수를 동시에 수정하면 데이터 불일치 문제가 발생할 수 있으므로, 동기화 처리가 필요합니다.
    3. 인스턴스 멤버 접근 제한: static 메서드는 인스턴스 변수를 직접 사용할 수 없기 때문에, 객체 지향적인 설계에서 static 사용을 신중히 해야 합니다.

     

    결론

    자바의 static 키워드는 적절히 사용하면 메모리 사용을 최적화하고 객체 생성 없이도 기능을 제공하는 강력한 도구가 될 수 있습니다. 하지만 과도한 사용은 유지보수성과 확장성을 저해할 수 있으므로, 주의해서 사용해야 합니다.

     

     

     

    댓글