Intro

이 글은 자바의 static 변수에 대해서 다룹니다.


static 변수란?

img

static 변수는 클래스 수준의 변수로, 객체마다 독립적으로 존재하지 않고 클래스 자체에 속하는 변수이다.
static 변수는 클래스 메모리 영역(Method Area)에 저장된다는 특징을 가진다.
프로그램이 종료되거나 클래스가 언로드될 때까지 유지된다.

즉, 모든 객체가 공유하는 하나의 메모리 공간을 가지며, 클래스 로딩 시 초기화된다.


여러 테스트로 확인해보는 static 변수의 특징

테스트 코드 01

package javainput;

public class StaticTest {

    static int num = 10;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticTest st1 = new StaticTest();
        StaticTest st2 = new StaticTest();
        
        System.out.println(st1.num); // 10 출력
        System.out.println(st2.num); // 10 출력
    }
}

출력 결과

10

10

 

그럼 인스턴스로 각각 다른 주소로 클래스를 메모리에 올려서 값을 변경하면 어떻게 될까?

 테스트 코드 02

package javainput;

public class StaticTest {

    static int num = 10;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticTest st1 = new StaticTest();
        StaticTest st2 = new StaticTest();
        
        st1.num = 11;
        st2.num = 12;
        
        System.out.println(st1.num); // 10 출력
        System.out.println(st2.num); // 10 출력
    }
}

출력 결과

12

12

출력 결과에서 알 수 있듯이, 인스턴스에서 마지막으로 할당한 값으로 모든 결과가 출력이 된다.

static 변수는 이러한 점 말고도 객체 생성 없이 접근할 수 있다는 특징을 가진다.

테스트 코드 03

package javainput;

public class StaticTest {

    static int num = 10;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StaticTest st1 = new StaticTest();
        StaticTest st2 = new StaticTest();
        
        System.out.println(StaticTest.num); // 10 출력
        System.out.println(st1.num);
        System.out.println(st2.num);
    }
}

출력 결과

10

10

10


주의할 점

객체가 아닌, 클래스에 속하는 변수라서 객체의 고유 상태를 나타내기 어렵다.

프로그램이 종료될 때까지 메모리에 남아 있기 때문에, 잘못 관리하면 메모리 누수가 발생할 수 있다.

주로 공유 데이터, 상수 등에 사용되며 여러 부분에서 변수를 건드리는 일이 있을 때 동기화에 신경을 써야 한다.

 

태그:

카테고리:

업데이트:

댓글남기기