객체는 생성될 때마다 객체마다 변수를 각각 가지고 있습니다.
만약에, 모든 객체들이 공유해야 하지만, 각 객체마다 가지고 있을 필요는 없는 변수를 사용해야 한다면?
이런 경우에는 각 객체마다 변수를 선언해 주기에는 불필요하게 메모리를 사용하게 됩니다 또, 각 객체마다 선언한 그 변수의 값을 증가시켜야 한다면? 모든 객체에 있는 변수들을 다 증가시켜 주어야합니다. 어떻게 공유성 & 메모리 효율성의 문제를 해결할 수 있을까요? 이때, static
변수를 사용하는 방법이 바로 해결 방법입니다. 예를 들어 봅시다.
🔔 코드
public class Counter {
static int count = 0;
Counter() {
this.count++;
System.out.println(this.count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
}
}
📝 설명
위 코드는 조회수를 측정하는 프로그램이라고 가정합니다. main 함수
에서 보면, Counter 객체를 2개 생성하고 있습니다. 결과는 어떻게 될까요?
📤 결과
위 코드를 실행한 결과는
1
2
이와 같습니다. c1, c2 객체 생성시 생성자에서 static
변수인 count
의 값을 1씩 증가했더니, c1과 c2의 count
값이 공유(같은 메모리 주소를 바라보기 때문)되어 방문자수가 증가되어 출력됩니다.
이렇게 변수에 static
키워드를 붙이면, 아무리 객체를 많이 생성해도, 딱 한 번만 메모리 할당을 해주게 됩니다.
static
키워드가 메소드 앞에 붙으면 이 메소드는 static method
가 됩니다.
🔔 코드
public class Counter {
static int count = 0;
Counter() {
this.count++;
}
public static int getCount() {
return count;
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.getCount());
}
}
📝 설명
아까 앞서 봤던 코드에서 getCount()
라는 메소드가 추가되었습니다.
⭐ static method
안에서는 객체변수 접근이 불가능합니다. static 메소드에서는 오로지 static
변수만!!
🔑 오늘 살펴봤던
static
변수와static
메소드는 객체를 생성하지 않고도 클래스의 이름으로 호출할 수 있습니다. ex)Counter.getCount()
🔑 그리고 이 시리즈의 다른 글에서 볼 수 있는 싱글톤 패턴에서static
키워드는 아주 중요한 역할을 하는 친구입니다.