Study/Java

정적 멤버와 static

sowon02 2025. 7. 8. 17:10

1. 정적 멤버와 static 개념

  • static 키워드는 클래스에 속하는 멤버(변수, 메소드, 블록)를 만들 때 사용한다.
  • 정적 멤버(Static Member)는 클래스가 로드될 때 메모리에 단 한 번 생성되고, 인스턴스(객체)를 생성하지 않고도 사용할 수 있다.
  • 인스턴스별로 다른 값을 가지는 멤버가 아닌, 모든 객체가 공유하는 공통된 멤버라고 생각하면 된다.

2. 정적 멤버 선언

 
   
    class Example {
        static int staticVar = 10; // 정적 변수 (클래스 변수)
        int instanceVar = 5;       // 인스턴스 변수
    }
  • staticVar는 클래스에 속하며, 객체 생성 없이 접근 가능
  • instanceVar는 객체마다 별도로 존재함.

3. 정적 멤버 사용

클래스가 메모리에 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트 연산자로 접근하면 됨.

 

 
public class Main {
    public static void main(String[] args) {
        System.out.println(Example.staticVar); // 객체 생성 없이 사용 가능

        Example ex1 = new Example();
        Example ex2 = new Example();

        ex1.instanceVar = 7;    // ex1의 인스턴스 변수 값 변경
        ex2.instanceVar = 9;    // ex2의 인스턴스 변수 값 변경

        ex1.staticVar = 20;     // staticVar는 모든 객체가 공유하므로 값 변경 시 모두에게 영향

        System.out.println(Example.staticVar); // 20
        System.out.println(ex2.staticVar);     // 20 (ex2로 접근해도 클래스 변수에 접근하는 것)
    }
}
  • 정적 멤버는 객체 생성 없이 클래스명으로 바로 접근하는 것이 일반적
  • 정적 변수는 모든 인스턴스가 공유

4. 정적 초기화 블록(static initializer block)

  • 정적 멤버를 초기화할 때 복잡한 작업이 필요하면 정적 초기화 블록을 사용할 수 있다.
  • 클래스가 메모리에 처음 로드될 때 딱 한 번 실행된다.
 
class Example {
    static int staticVar;

    static {
        staticVar = 100;
        System.out.println("Static 초기화 블록 실행");
    }
}
 
  • 위 블록은 클래스 로딩 시 실행되어 staticVar를 초기화
  • 정적 초기화 블록에서는 연산을 사용하여 초기화할 수 있

5. 정적 메소드와 블록 선언 시 주의할 점

  • 정적 메소드와 정적 블록은 객체 생성 없이 실행된다는 특징 때문에 주의가 필요함
  • 인스턴스가 생성되기 전에 실행되므로:
    • 인스턴스 필드(변수)를 사용할 수 없다.
    • 인스턴스 메소드를 호출할 수 없다.
    • this 키워드를 사용할 수 없다.
  • 정적 메소드 및 정적 블록 내부에서는 정적 멤버(정적 변수, 정적 메소드)만 사용 가능하다.
    class Example {
        int instanceVar = 10;
        static int staticVar = 20;

        static void staticMethod() {
            // System.out.println(instanceVar); // 오류: 인스턴스 필드 사용 불가
            // instanceMethod();               // 오류: 인스턴스 메소드 사용 불가
            // System.out.println(this.staticVar); // 오류: this 사용 불가

            System.out.println(staticVar);      // 정적 변수 사용 가능
            staticMethod2();                    // 정적 메소드 호출 가능
        }

        static void staticMethod2() {
            System.out.println("Static method 2 실행");
        }

        void instanceMethod() {
            System.out.println("Instance method 실행");
        }
    }

정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야함 


6. 싱글톤 패턴과 static

  • 싱글톤(Singleton) 패턴은 클래스의 인스턴스가 딱 한 개만 생성되도록 보장하는 디자인 패턴
  • 주로 정적 변수(static field)에 인스턴스를 저장하고, 정적 메소드로 접근하는 방식으로 구현된다.
  • 자세한 내용은 다음 글에서..
 

 

'Study > Java' 카테고리의 다른 글

싱글톤(Singleton)  (0) 2025.07.08
인스턴스 멤버와 this  (0) 2025.07.08
접근제어자  (0) 2025.07.08
상속(Inheritance)와 다형성(Polymorphism)  (0) 2025.07.07
캡슐화(Encapsulation)  (0) 2025.07.06