본문 바로가기
프로그래밍언어/Java

[Java] : 인스턴스 변수와 클래스 변수

by 오주현 2022. 1. 15.
반응형

인스턴스 변수와 클래스 변수

인스턴스 변수는 인스턴스를 생성을 하고 난 뒤에 사용할 수 있는 변수들을 말한다.

class pen {
	String color;
	int number;
}

color과 number 인스턴스 변수는 클래스 안에 존재하지만 실제 공간이 할당되진 않는다.

pen pen = new pen();

pen에 대한 인스턴스를 생성했다.

이러면 이제 pen의 color과 number를 지정할 수 있게 되는데 이렇게 되야 인스턴스 변수의 공간이 할당되게 된다.

공부하는 책에서는 이런 과정을 설계도와 결과물로 설명을 하였는데 클래스를 설계도로 보고 있고 인스턴스를 결과물로 보고 있다.

pen 클래스에서 변수를 선언했지만 = 설계도를 작성했지만

공간이 할당 되진 않았다. = pen의 실체는 없다.

인스턴스를 생성하면서 인스턴스 변수가 활성화 된다. = pen의 실체가 보인다.

이런 맥락으로 책에서는 설명하고 있다.

클래스 변수는 클래스 안에 공간이 할당된 변수를 말한다. 인스턴스 변수와는 조금 다르다. 때문에 클래스 변수에는 인스턴스에 별도 공간이 할당 되지 않고 여러 인스턴스가 클래스 변수의 공간을 같이 사용하게 된다.

클래스 변수 생성을 위해서는 static 키워드를 사용하면 된다.

static을 사용하게 되면 클래스 자체에 공간이 생기고 인스턴스를 생성해도 추가로 공간을 할당하지 않고 클래스에 이미 생성된 공간을 공유해서 사용하게 된다.

코드 예시

class CupSetting {

    String color;
    int number;
    // 클래스 변수는 선언 후 초기화 해줘야 한다.
    static int count = 0;

    CupSetting() {
        count++;
    }
}

필드에 인스턴스 변수와 static를 통해 클래스 변수를 생성하고 0으로 초기화를 해줬다.

생성자에는 따로 인스턴스 변수를 넣지 않았고 count만 올려주는 코드를 넣어뒀다.

public class Cup {
    public static void main(String[] args) {
        CupSetting myCup1 = new CupSetting();
        System.out.println(myCup1.count + "번째 컵 입니다.");

        CupSetting myCup2 = new CupSetting();
        System.out.println(myCup2.count + "번째 컵 입니다.");

        CupSetting myCup3 = new CupSetting();
        System.out.println(myCup3.count + "번째 컵 입니다.");

    }
}

생성자를 통해 인스턴스를 생성하고 바로 count를 출력해 본다.

파라미터값을 따로 넘겨준 것이 없어도 이미 선언과 초기화를 하면서 클래스 자체에 static 공간이 할당이 되었기 때문에 인스턴스에 속하지 않은 채로 count값이 증가하는 것을 확인할 수 있다.

반응형

댓글