본문 바로가기
Back-end

자바 static

by 신재권 2023. 8. 13.

정적 코드

정적 코드(static code)는 클래스나 객체의 인스턴스 생성 없이 호출하거나 사용할 수 있는 코드 입니다.

  • 정적 변수 : 클래스의 모든 인스턴스가 공통으로 사용하는 변수이고, 객체가 생성되어 있지 않아도, 클래스 이름으로 접근 가능합니다.
  • 정적 메서드 : 인스턴스 생성 없이 호출 가능한 메서드로, 객체가 생성되어 있지 않아도, 클래스 이름으로 접근이 가능합니다.
  • 정적 블록 : 클래스 로딩 시 실행되는 블록으로, 클래스의 초기화 작업을 수행합니다. 또한 생성자로 클래스 로딩 시 더 우선적으로 수행됩니다.

내부 클래스 static

내부 클래스는 static으로 선언해야 한다.

만약 static 으로 선언하지 않으면 외부 참조를 하게 된다.

즉, 내부 클래스가 외부의 멤버를 사용하지 않아도 숨겨진 외부 참조가 생성된다.

만약 외부 클래스가 필요 없어지고, 내부 클래스만 남아 있어도, 외부 클래스를 대상으로 GC를 수행해야 하지만, 외부 참조로 내부 클래스와 연결되어 있기 때문에 메모리에서 제거가 되지 않아 메모리 누수 현상이 발생할 수 있다.

결론적으로 내부 클래스가 외부 클래스의 멤버를 가져와 사용하는 경우가 아니면 메모리 누수 현상이 발생할 수 있기 때문에 static 키워드를 붙여서 사용해야 한다.

static 블록과 선언 순서 주의점

public class StaticInitializationOrder {
    static int x = 5;
    static int y = getX();

    static {
        y = 10;
    }

    static int getX() {
        return x;
    }

    public static void main(String[] args) {
        System.out.println("x: " + x);
        System.out.println("y: " + y);
    }
}
---------------------------실행 결과------------------------------
x: 5
y: 10
public class StaticInitializationOrder {
    static int x = 5;

    static {
        y = 10;
    }

    static int y = getX();

    static int getX() {
        return x;
    }

    public static void main(String[] args) {
        System.out.println("x: " + x);
        System.out.println("y: " + y);
    }
}
---------------------------실행 결과------------------------------
x: 5
y: 5

즉, static 블록을 사용할 때는 선언 순서에 따라 다르게 동작하게 됩니다.

1번째를 설명하자면 다음과 같습니다.

  1. static int x 선언, x = 5 할당
  2. static int y 선언, getX()로 y = 5 할당
  3. static 블록으로 y = 10 재할당

2번째를 설명하자면 다음과 같습니다.

  1. static int x 선언 , x = 5 할당
  2. static 블록으로 y = 10 할당하였지만, y가 메모리에 올라가지 않은 상태라 아무런 작업이 되지 않음
  3. static int y 선언, getX()로 y = 5 할당

즉, static 변수와 블록을 같이 사용하면 선언 순서에 따라 코드의 초기화가 달라질 수 있습니다.

'Back-end' 카테고리의 다른 글

2023.08.13 TIL  (0) 2023.08.13
왜 enum(열거형)을 상속하지 못할까?  (0) 2023.08.13
접근 지정자  (0) 2023.08.13
GC  (0) 2023.08.12
JVM  (0) 2023.08.11