인스턴스 변수란 객체가 생성될 때 함께 생성되는 변수를 의미합니다. 인스턴스 변수는 각 인스턴스에 속하며, 인스턴스 변수마다 독립적인 값을 가집니다. 클래스 내부에서 선언되지만, static 키워드가 없습니다.
인스턴스 변수는 인스턴스를 통해 접근해야 하며, 인스턴스화가 필요합니다. 이는 인스턴스 변수가 인스턴스에 속하기 때문입니다.
Public class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
public static void main(String[] args) {
Person p1 = new Person(); // 객체 생성 (Heap에 인스턴스 변수 name, age 저장)
p1.name = "홍길동";
p1.age = 25;
Person p2 = new Person(); // 또 다른 객체 생성 (Heap에 name, age 저장)
p2.name = "안중근";
p2.age = 30;
System.out.println(p1.name + " - " + p1.age); // 홍길동 - 25
System.out.println(p2.name + " - " + p2.age); // 안중근 - 30
}
}
실행 결과
홍길동 - 25
안중근 - 30
클래스 변수(static 변수)는 static 키워드를 사용하여 선언되며, JVM의 Method Area(메서드 영역)에 저장됩니다. 모든 객체가 동일한 값을 공유하며, 프로그램이 실행될 때(클래스가 로딩될 때) 한 번만 생성되고, 프로그램이 종료될 때까지 유지됩니다.
클래스 변수는 클래스명.변수명으로 접근할 수 있으며, 인스턴스화 없이 사용할 수 있습니다. 이는 클래스 변수가 클래스 자체에 속하기 때문입니다.
클래스명.변수명으로 접근 가능)public class Counter {
int count = 0; // 인스턴스 변수 (객체마다 개별적으로 존재)
static int totalCount = 0; 클래스 변수 (모든 객체가 공유)
// 생성자
public Counter() {
count++; // 객체마다 개별적으로 증가
totalCount++; // 모든 객체가 공유하는 값 증가
}
public static void main(String[] args) {
Counter c1 = new Counter(); // c1.count = 1, Counter.totalCount = 1
Counter c2 = new Counter(); // c2.count = 1, Counter.totalCount = 2
Counter c3 = new Counter(); // c3.count = 1, Counter.totalCount = 3
System.out.println("c1.count = " + c1.count); // 1
System.out.println("c2.count = " + c2.count); // 1
System.out.println("c3.count = " + c3.count); // 1
System.out.println("totalCount = " + Counter.totalCount); // 3
}
}
실행 결과
c1.count = 1
c2.count = 1
c3.count = 1
totalCount = 3
static 변수를 사용하면 모든 객체가 같은 값을 공유하고, 인스턴스 변수는 객체마다 개별적으로 관리됩니다.
| 구분 | 인스턴스 변수 (객체 변수) | 클래스 변수 (static 변수) |
|---|---|---|
| 저장 위치 | Heap (힙 영역) | Method Area (메서드 영역) |
| 생성 시점 | 객체 생성 시 | 클래스 로딩 시 (한 번만 생성) |
| 소멸 시점 | 객체가 GC에 의해 제거될 때 | 프로그램 종료 시 |
| 초기화 여부 | 기본값 자동 할당 | 기본값 자동 할당 |
| 접근 방식 | 객체를 통해 접근 (object.var) | 클래스명으로 직접 접근 (className.var) |
| 값 공유 여부 | 객체마다 개별적으로 존재 | 모든 객체가 공유 |
자바에서 변수들은 JVM의 서로 다른 메모리 영역에 저장됩니다.
static 변수는 Method Area(메서드 영역)에 저장되며, Heap과 Stack에는 저장되지 않습니다.
인스턴스 변수는 Heap에 저장되며 각 객체 생성 시(new 연산자) 같이 생성되어 객체마다 개별적으로 관리합니다.
| 변수 유형 | 저장 위치 | 예제 |
|---|---|---|
| 지역 변수 | Stack (스택 영역) | int x = 10; |
| 매개변수 | Stack (스택 영역) | method(int x) {} |
| 인스턴스 변수 | Heap (힙 영역) | int count; |
클래스 변수 (static) | Method Area (메서드 영역) | static int totalCount; |
각 변수는 저장되는 위치뿐만 아니라 생성되는 시점과 사라지는 시점도 다릅니다.
static 변수(클래스 변수)는 프로그램이 실행될 때 한 번만 생성되고, 인스턴스 변수는 객체가 생성될 때마다 새롭게 할당됩니다.
| 단계 | 인스턴스 변수 (객체 변수) | 클래스 변수 (static 변수) |
|---|---|---|
| 생성 시점 | new 연산자로 객체 생성 시 | 클래스가 로딩될 때 (프로그램 시작 시) |
| 저장 위치 | Heap (객체 내부) | Method Area (클래스 정보와 함께 저장) |
| 접근 방법 | 객체명.변수명 (object.var) | 클래스명.변수명 (className.var) |
| 소멸 시점 | 객체가 GC에 의해 삭제될 때 | 프로그램 종료 시까지 유지 |