JAVA 변수란?

이번 Posting에서는 객체와 클래스에 대하여 정리를 할 것이다. 물론 "클래스는 무엇인가 ? 인스턴스는 무엇인가?"에 대한 기초적인 이야기를 할 것은 아니다.

new

new라는 키워드가 하는 일은 동적할당을 한다는 것은 모두가 알고 있을 것이다. 예를 들어


1
Test t = new Test();

위와 같이 코드를 작성했다고 하면 Test 클래스의 인스턴스가 어떤 메모리 공간(method area)에 생성된다. 이렇게 생성된 공간을 가리키는 참조 변수는 t가 되는 것이다.

여기서 만약 다음과 같이 하면 어떻게 될까?

1
t = null;

 그대로 메모리 공간에 남게 되는 것일까? 아니면 자동으로 소멸이 되는 것일까?
정답은 남는다가 맞다. C에서는 계속 남아있게 되어 memory leak이 발생하지만, JAVA에서는 GC가 참조되지 않는 인스턴스의 메모리를 해제 시킨다.

JAVA 메모리 할당

메모리를 이야기하기 위해서는 사전에 알아야할 것이 있다. 그 것은 바로 변수의 종류이다.
java 변수에는 크게 3가지로 변수를 나눈다, "클래스 변수", "인스턴스 변수", "지역 변수" 이렇게 3가지가 존재하는데 다음 그림을 보면 이해가 빠를 것이다.

인스턴스 변수는 인스턴스가 생성될 때 만들어 진다. 또 다른 특징은 인스턴스 변수는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다는 것이다.

클래스 변수는 클래스가 메모리에 올라갈 때 생성된다. 따라서 인스턴스를 생성하지 않은 때에도 사용이 가능하다. 그리고 앞에 public 키워드를 붙인다면 같은 프로그램 내에서 어디서나 접근할 수 있는 전역변수의 특성을 갖는다. 또한 인스턴스 변수 앞에 static 키워드만 붙이면 클래스 변수가 된다. 즉, 모든 인스턴스가 공유하는 변수가 된다는 이야기이다.

다음 코드를 보자 확실한 이해가 될 것이다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class Variables {
    String str;         // instance variable
    int i;              // instance variable
    static int x, y;    // class variable

    public static void main(String[] args) {
        System.out.println(x + "," + y);    // 0, 0
        //System.out.println(str + i);// they're not class variable

        Variables v = new Variables();
        v.i = 1;v.str = "1";

        Variables v2 = new Variables();
        v2.x = 2;v2.y = 1;

        System.out.println(v.x + ", " + v.y);   // 2, 1
    }
}

이 블로그의 인기 게시물

웹툰 무료로 볼 수 있는 사이트

BackJoon 1011, Fly me to the alpha centauri, 규칙 찾기 문제

BaekJoon 6591, 이항 쇼다운 조합문제