Java를 공부하다보면 static을 자주 접했을 것이고 또 static과 final에 대해 느낌적으로는 알지만 이론적, 개념적으로는 헷갈리는 경우가 있을 것이다. 그래서 오늘은 이에 관해 포스팅할 것이다.
Java에서 static 키워드를 사용한다는 것은 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때 까지 그 메모리에 값이 유지된다는 것을 의미한다. 쉽게 설명하자면 특정한 값을 공유를 해야하는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다. 값 보다는 메모리라는 말을 좀 더 생각해 보면 이해가 될 것이다. 예제를 통해 이해를 해보자.
예를 들어 게시물을 누를때마다 좋아요 값을 증가시키는 HeartCounter기능을 구현 해야한다고 가정을 하자.
// 이 코드는 반드시 직접 실행해 보기 바랍니다.
public class HeartCounter {
// static 변수로 실행했을 때와 일반 변수로 실행했을 때의 차이점 깨닫기!
int count;
//static int count;
public HeartCounter() {
this.count ++;
System.out.println("좋아요 갯수 : " + this.count);
}
public static void main(String[] args) {
HeartCounter hc1 = new HeartCounter();
HeartCounter hc2 = new HeartCounter();
}
}
위의 예제에 대한 결과를 직접 적지는 않겠다. 그 이유는 직접 코드를 작성함으로써 static이 어떠한 동작을 하는지를 직접 이해했으면 하는 바램이 있기 때문이다.
부가 설명을 하자면 인스턴스 변수는 클래스가 생성될때 메모리 공간이 할당되고 생성자에 있는 값으로 초기화가 된다. 그러나 static변수(클래스 변수)는 어디에서 선언이 되더라도 그 클래스 내에서는 공유가 되어진다. static이 선언되는 순간에 하나의 메모리 공간이 할당되기 때문이다.
예제에서 인스턴스 변수를 사용하면 hc1, hc2객체가 생성되면 hc1의 count와 hc2의 count가 서로 다른 메모리를 할당 받는다. 그러나 static변수를 사용하면 두 객체가 생성 될 때 count는 하나의 메모리만 할당을 받게 되는 것이다.
staic메서드는 객체의 생성 없이 호출이 가능하고, 객체에서는 호출이 불가능하다. 또한 static 메서드 안에서는 인스턴스 변수 접근이 불가능하다. 위 예제에서
// 생략
public static int getCount() {
return count;
};
public static void main(String[] args) {
HeartCounter hc1 = new HeartCounter();
HeartCounter hc2 = new HeartCounter();
System.out.println("총 count " + HeartCounter.getCount());
}
이 코드를 추가해서 main메서드에 넣은 후 실행 해보고 아까와 같이 count 변수를 static 변수와 인스턴스 변수로 선언해서 실행했을 때 어떠한 일이 일어나는지 각자 확인보자.
그러면 인스턴스변수로 선언했을 때 오류가 날 것이다. 또한 getCount() 메서드는 지금 static으로 선언을 했기때문에 hc1이나 hc2객체로 호출을 하지 않아도 된다.