본문 바로가기


Java

[Java] 멤버변수:클래스 변수, 인스턴스 변수

오늘은 자바의 멤버변수인 클래스 변수와 인스턴스 변수의 차이에 대해 포스팅하겠습니다.



1. 클래스 변수

클래스 변수란 클래스 내에서 static을 붙여서 선언하는 변수를 말합니다.

클래스 변수는 한번 선언되면 해당 클래스의 모든 인스턴스가 같은 저장공간을 가리킵니다. 전역변수라고 부르기도 합니다.


같은 저장공간을 가리킨다는 것이 무슨 의미인지는 다음 예제를 보면 이해하기 쉬울 것입니다.


 public class Webtest {
	static int sval = 123;
	public static void main(String[] args) {
		Webtest ex1 = new Webtest();
		Webtest ex2 = new Webtest();
		System.out.println(ex1.sval);
		ex2.sval = 321;
		System.out.println(ex1.sval);
	}
}


이예제를 실행하면 다음과 같은 결과가 나옵니다


123

321


그 이유는 클래스 변수인 sval은 모든 인스턴스에서 하나의 저장공간을 공유하기 때문에 다른 인스턴스에서 변경하면 다른 인스턴스도 변경된 값을 가지게 되기 때문입니다.


클래스변수의 또다른 특징은 인스턴스 없이 함수내 호출이 가능하다는 것 입니다.


다음 예제를 보시면 이해할 수 있습니다.


   public class Webtest {

	static int sval = 123;

	public static void main(String[] args) {
		System.out.println(sval);
	}
}


이와 같이 인스턴스없이 바로 변수에 접근해서 사용할 수 있습니다.



2.인스턴스 변수

인스턴스 변수는 클래스 변수와 마찬가지로 클래스 내에 선언합니다.

클래스 변수와의 차이점은 인스턴스에 종속되어 인스턴스 생성시 마다 새로운 저장공간을 할당합니다 즉 저장공간이 공유되지 않습니다.

또한 인스턴스에 종속되기 때문에 꼭 인스턴스객체에서 호출해 주어야합니다.

이런 점들이 클래스 변수와의 가장 큰 차이 점입니다.


다음 예제를 보시죠


 public class Webtest {

	static int sval = 123;
	int ival = 321;
	public static void main(String[] args) {
		System.out.println(sval);
		// System.out.println(ival);  *error
		
		Webtest ex1 = new Webtest();
		Webtest ex2 = new Webtest();
		
		ex1.ival = 456;
		
		System.out.println(ex1.ival);
		System.out.println(ex2.ival);
	}
}


다음 예제를 실행하면 다음과 같은 값이 출력됩니다.


123

456

321


이 예제에서 주석 처리 된 부분은 에러가 나는 코드입니다. 

인스턴스 변수인 ival은 인스턴스없이 접근할 수 없기 때문입니다. 또한 ex1과 ex2의 출력 차이를 통해 저장공간이 공유되지 않음을 알 수 있습니다.






이번 포스팅에서는 클래스 변수와 인스턴스 변수의 차이에 대해서 알아보았습니다. 다음 포스팅에서는 final변수와 static변수의 차이 그리고 지역변수에 대해 알아보겠습니다.