스태틱(Static) - 1
class HouseLee {
String lastname = "이";
}
public class Sample {
public static void main(String[] args) {
HouseLee lee1 = new HouseLee();
HouseLee lee2 = new HouseLee();
}
}
- 이씨 집안을 나타내는 HouseLee 클래스이다. 위와 같은 클래스를 만들고 객체를 생성하면 객체마다 객체변수 lastname을 저장하기 위한 메모리가 별도로 할당된다. 하지만 가만히 생각해 보면 HouseLee 클래스의 lastname은 어떤 객체이던지 동일한 값인 "이"이어야 할 것 같지 않은가? 이렇게 항상 값이 변하지 않는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다.
class HouseLee {
static String lastname = "이";
}
public class Sample {
public static void main(String[] args) {
HouseLee lee1 = new HouseLee();
HouseLee lee2 = new HouseLee();
}
}
- 위와 같이 lastname 변수에 static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리 사용에 이점이 있다.
- 만약 HouseLee 클래스의 lastname 값이 변경되지 않기를 바란다면 static 키워드 앞에 final이라는 키워드를 붙이면 된다. final 키워드는 한번 설정되면 그 값을 변경할 수 없다. 변경하려고 하면 오류가 발생한다.
스태틱(Static) - 2
- static을 사용하는 또 한가지 이유로 공유 개념을 들 수 있다. static으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유하게 되는 것이다.
- 웹사이트 방문시마다 조회수를 증가시키는 Counter 클래스가 다음과 같다고 가정해보자.
class Counter {
int count = 0;
Counter() {
this.count+=1;
System.out.println(this.count);
}
}
public class Sample {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
}
}
- c1, c2 객체 생성시 생성자에서 객체변수인 count의 값을 1씩 증가하더라도 c1과 c2의 count는 서로 다른 메모리를 가리키고 있기 때문에 원하던 결과(카운트가 증가된 결과)가 나오지 않는다. 객체변수는 항상 독립적인 값을 갖기 때문에 당연한 결과이다.
class Counter {
static int count = 0;
Counter() {
count+=1;
System.out.println(count);
}
}
public class Sample {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
}
}
- int count = 0 앞에 static 키워드를 붙였더니 count 값이 공유되어 다음과 같이 count가 증가되어 출력된다.
- 보통 변수의 static 키워드는 프로그래밍시 메모리의 효율보다는 공유의 목적으로 훨씬 더 많이 사용한다.