변수는 프로그램이 조작할 수 있는 이름이 부여된 저장 공간을 의미합니다. Java에서 모든 변수는 특정 타입을 가지며, 이 타입은 해당 변수가 차지하는 메모리의 크기와 구조, 저장할 수 있는 값의 범위, 그리고 변수에 적용할 수 있는 연산의 종류를 결정합니다.
정적 변수(Static Variable)
정적 변수는 클래스 변수(class variable)라고도 불리며, 클래스의 모든 객체가 공유하는 변수입니다. 객체를 생성하지 않고도 클래스명.변수명 형태로 클래스 이름을 통해 직접 접근할 수 있다는 것이 특징입니다.
비정적 변수(Non-Static Variable)
클래스 내에서 static 키워드로 선언되지 않은 모든 변수를 비정적 변수 또는 인스턴스 변수(instance variable)라고 합니다. 인스턴스 변수는 각 객체마다 독립적으로 존재하며, 객체가 생성될 때 함께 만들어집니다.
아래는 정적 변수와 비정적 변수의 주요 차이점을 정리한 표입니다.
| 번호 | 구분 기준 | 정적 변수 | 비정적 변수 |
|---|---|---|---|
| 1 | 접근성 | static 멤버 함수뿐만 아니라 non-static 멤버 함수에서도 접근할 수 있습니다. | static 멤버 함수에서는 접근할 수 없습니다. |
| 2 | 공유 여부 | 전역 변수처럼 동작하며, 클래스의 모든 객체가 하나의 값을 공유합니다. | 변수가 생성된 인스턴스 객체에만 속하며, 객체별로 독립적인 값을 가집니다. |
| 3 | 메모리 할당 | 차지하는 공간이 적고, 메모리 할당은 단 한 번만 이루어집니다. | 객체 수에 따라 더 많은 공간을 차지할 수 있으며, 메모리 할당은 런타임에 발생합니다. |
| 4 | 선언 방식 | static 키워드를 사용하여 선언합니다. | 특별한 키워드 없이 일반적인 방식으로 선언합니다. |
정적 변수 vs 비정적 변수 예제
JavaTester.java
public class JavaTester {
public int counter = 0;
public static int staticCounter = 0;
public JavaTester(){
counter++;
staticCounter++;
}
public static void main(String args[]) {
JavaTester tester = new JavaTester();
JavaTester tester1 = new JavaTester();
JavaTester tester2 = new JavaTester();
System.out.println("Counter: " + tester2.counter);
System.out.println("Static Counter: " + tester2.staticCounter);
}
}실행 결과
Counter: 1 Static Counter: 3
위 예제에서 객체를 세 번 생성했을 때, 인스턴스 변수인 counter는 각 객체마다 별도로 존재하기 때문에 마지막 객체인 tester2의 값은 1입니다. 반면 정적 변수인 staticCounter는 모든 객체가 공유하기 때문에 세 번의 생성자 호출이 누적되어 3이 출력됩니다. 이 결과를 통해 두 변수의 메모리 할당과 공유 방식의 차이를 명확히 확인할 수 있습니다.