자바 static 변수 | 자바 입문강좌 14

자바 static 변수

static 이란 ‘정적인’이란 뜻을 가지고 있습니다. 프로그래밍 언어에서 static 이란 단어가 자주 등장하는데요. 어떤 대상을 수식하고 있느냐에 따라 의미가 달라지기 때문에 주의해야 합니다.

이번 포스팅에서는 자바 static 변수를 알아보겠습니다.

자바 static 변수
자바 static 변수

이전 학습에서 클래스와 인스턴스의 관계에 대하여 클래스는 설계도이고 인스턴스는 제품과 같은 관계라고 이야기 했습니다.

클래스는 하나지만 인스턴스는 여러개 될 수 있습니다. 그리고 인스턴스가 가지고 있는 각자의 멤버변수들은 다 다릅니다.

그런데 인스턴스 변수들이 서로 값을 공유해야 하는 경우에는 어떨까요? 뭐 인스턴스만으로도 만들 수는 있을 것입니다. 한개의 인스턴스를 모두가 공유하는 인스턴스로 만들 수 있겠죠. 하지만 그렇게 하면 혼동스러울 뿐 아니라 자원의 낭비가 발생합니다.

클래스에 static 변수라고 하는 변수를 하나 만들어서 공유하면 관리도 쉽고 자원도 낭비되지 않습니다.

static 변수는 말그대로 정적인 변수이기 때문에 프로그램이 최초 실행되었을 때 이미 메모리에 생성이 됩니다. (클래스 선언 시 생성) 따라서 인스턴스를 생성하지 않고도 프로그램의 처음부터 static 변수를 사용할 수 있습니다.

public class Main {

    public static void main(String[] args) {
        System.out.println(myStatic.count);
    }
}
class myStatic{
    static int count = 7;
}
[실행값]
7

인스턴스가 없이도 클래스 이름으로 사용할 수 있습니다.

        myStatic m1 = new myStatic();
        System.out.println(m1.count);

또한 인스턴스에서도 사용할 수 있습니다. static 변수는 모든 인스턴스가 공유합니다.

클래스가 기준이 되기 때문에 static 변수를 클래스변수(class variable) 라고도 합니다. 클래스에 하나 있고 모든 인스턴스가 공유하는 것 입니다. 클래스이름으로도 사용할 수 있고 각 인스턴스의 이름으로도 사용할 수 있습니다.

static 변수 메모리 배치

메모리 참조
메모리 참조

자, 이게 보면 조금 복잡해 보이긴 합니다만, static 에 대하여 알아야 할 포인트입니다. 사실 C언어에서 메모리 공부를 먼저 해야하는 부분인데요. C언어를 모른다면 나중에 C언어를 배우는 날에 다시 이해하게 될 것이니 편안하게 보면 됩니다.

메모리에는 여러개의 영역이 있습니다. 대표적인 영역이 스택과 힙입니다. 코드영역, 데이터영역도 있습니다. 여기 그림에서는 클래스의 static 변수는 데이터 영역에 들어가 있고 클래스와 인스턴스가 모두 데이터 영역 안의 static 변수인 count 를 가리키고 있습니다.

한편 인스턴스의 참조변수는 스택메모리에 있습니다. 스택메모리에 있는 것은 해시값이죠. 이들의 실제 값은 힙메모리 영역에 있습니다.

조금 복잡합니다만, 이것이 자바가 변수를 사용하는 방식입니다. 프로그래밍을 하는 입장에서 중요한 점은 메모리 영역이 다르면 변수의 수명이 다르다는 점입니다.

데이터영역은 프로그램 시작부터 끝까지 남아있습니다. 스택영역과 힙영역은 GC(가비지 컬렉션)이 더이상 쓸모 없다고 판단하면 해제합니다. GC는 메모리유출을 방지하기 위해 힙영역을 먼저 해제 시켜야 합니다.

static 변수 사용법

static 변수는 모두가 사용할 수 있습니다.

클래스의 생성자에 static 변수를 넣고 증가시키면 카운터로써 역할을 합니다. 소멸자에서 감소시키면 인스턴스의 개수를 기록할 수 있습니다.

public class Main {

    public static void main(String[] args) {
        System.out.println(myStatic.count);
        myStatic m1 = new myStatic();
        System.out.println(m1.count);
        myStatic m2 = new myStatic();
        System.out.println(m1.count);
        m1.count++;
        m2.count++;
        myStatic.count++;
        System.out.println(myStatic.count);
    }
}
class myStatic{
    static int count = 0;
    public myStatic(){
        count++;
    }
}
[실행값]
0
1
2
5

요약

자바 static 변수는 하나의 심플한 아이디어입니다. 하지만 내부적으로는 복잡한 부분도 있습니다. 클래스와 인스턴스가 함께 공유한다는 개념에 주의하도록 합니다.

외부참조문서

Static keyword in Java – Javatpoint

자바 static 변수와 메서드 | 자바 강좌

Leave a Comment