개발/java,spring

java static 변수에 대한 기초 개념 이해!

Mr.mandu. 2017. 10. 12. 05:00

자랑하는건 아니지만... 현재 개발 3년차 입니다.

그런데 가끔 프로젝트를 진행하다보면 아주 기초적인 개념 등을 몰라서

어리둥절한 경우를 겪게 됩니다.


이번에는... static 변수!

제가 알기로는 static 변수는 객체를 생성하지 않아도 접근이 가능하다... 정도?

그래서 프로젝트에서 관련 클래스안에 static으로 선언하여 몇번 사용하곤 했습니다.


그래도...나름 개발자인데!

알고 사용해야하지 않는가! 라는 생각에 정리해두기로 하였습니다.


static 변수

클래스 변수이다.

클래스가 정의만 되어도 접근이 가능한 변수

(인스턴스 변수는 인스턴스가 생성되었을때 접근 가능)



class InstCnt
{
	static int instNum=0;
	
	public InstCnt()
	{
		instNum++;
		System.out.println("인스턴스 생성: "+instNum);
	}
}

class ClassVar
{
	public static void main(String[] args)
	{
		InstCnt cnt1=new InstCnt();
		InstCnt cnt2=new InstCnt();
		InstCnt cnt3=new InstCnt();
	}
}
이소스는 간단한 예제 입니다.

실행 경과는

인스턴스 생성 : 1

인스턴스 생성 : 2

인스턴스 생성 : 3


아마 자바책 한번정도 보셨으면 결과에대해 이해 가셨으리라 생각합니다.

이해가 되지 않으면 댓글로 남겨주세요.

그래도 간단히 설명 드리면,

static으로 선언된 변수는 선언된 클래스의 모든 인스턴스가 공유하게 됩니다.


static 변수의 생성, 초기화 시점을 알아보기위하여

jvm 메모리에 관해 포스팅을 하였습니다.


[개발/java,spring] - 자바 가상머신(jvm) 메모리 모델, 개념 이해하기


static 변수의 초기화 시점

JVM에 의해서 클래스가 메모리 공간에 올라가는 순간

(이전 포스팅에 static 변수는 메소드 영역에 이미 저장되어 있다는것을 공부했습니다.)


static 변수의 활용

인스턴스 간에 데이터 공유가 필요한 상황.

(싱글톤 패턴으로 이어지는 개념이니 static은 알아두어야 할 개념인것 같습니다)




한가지 생각해보셔야 할 예제가 있습니다.


static 메소드의 인스턴스 변수 접근은 불가능하다!


Class Lee

{

int a;

static int b;

static void increaseNum(){

a++;     <----문제 발생

b++;     <---- 괜찮음

}


}


왜 문제가 되는가?

예를들어 

Lee one

Lee two

Lee three

라는 객체를 생성했다고 가정하고


one.invreaseNum();

two.invreaseNum();

three.invreaseNum();


함수를 실행 시킵니다.


이때가 문제가 됩니다.

increaseNum() 함수는 static으로 선언되어 있기 때문에 현재 공유되어 있는 상황입니다.

즉,


  one →  increaseNum()  ← two

                   ↑

   three


세 객체가 하나의 함수를 바라보고 있다는 뜻 입니다.

이때 과연 increaseNum()함수는 어떤 a의 값을 증가시켜야 할까요?

이와 같은 이유로

static 메소드는 인스턴스 멤버에 접근이 불가능하다는 것을 알 수 있습니다.