0. 서론
자바에서는 변수가 저장되는 위치와 생명 주기에 따라서 크게
클래스 변수
인스턴스 변수
지역 변수
로 나뉩니다
각각의 변수는 서로 다른 메모리 영역에 저장되며, 메모리 영역에 따라 변수의 생존 주기와 접근 방식이 달라지게 되는데요
오늘은 헷갈리는 변수의 개념을 잡아보도록 하겠습니다
1. 클래스 변수
- static 키워드를 사용해서 선언됩니다
- 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때까지 유지됩니다
- 모든 객체 (인스턴스) 에서 공유됩니다
- 메서드 영역에 저장됩니다
예시를 통해서 더욱 자세히 알아보도록 하겠습니다
class Example {
static int count = 0; // 클래스 변수 (정적 변수)
public Example() {
count++; // 객체가 생성될 때마다 count 증가
}
public static void printCount() {
System.out.println("현재 생성된 객체 수: " + count);
}
public static void main(String[] args) {
Example ex1 = new Example();
Example ex2 = new Example();
Example.printCount(); // 출력: 현재 생성된 객체 수: 2
}
}
static int count = 0;
Example 클래스 내부에 static 키워드를 사용해서 선언된 count 가 바로 클래스 변수입니다.
public Example() { count++; }
생성자를 통해 객체가 생성될 때마다 count 가 증가합니다.
Example ex1 = new Example();
Example ex2 = new Example();
Example.printCount();
main 에서 ex1, ex2 로 객체를 총 두번 만들었는데, printCount() 메서드 호출 시 현재 생성된 객체 수가 2로 나타내고 있습니다.
ex1 이 생성될 때 -> count + 1
ex2 가 생성될 때 -> count + 1
가 되는데 보통의 변수와는 다르게 count 는 클래스 변수로 모든 인스턴스에서 같은 변수를 사용하기 때문에 출력시 2가 출력됩니다.
2. 인스턴스 변수 (멤버 변수)
- 객체가 생성될 때 생성되는 변수입니다.
- 힙 영역에 저장됩니다.
- 각 객체마다 개별적으로 할당되기 때문에 서로 다른 객체는 독립적인 값을 가집니다
- 객체가 GC 에 의해 제거될 때까지만 유지됩니다.
예시를 통해서 더욱 자세히 알아보겠습니다
class Example {
int count; // 인스턴스 변수
public Example(int count) {
this.count = count;
}
public static void printCount() {
System.out.println("count : " + count);
}
public static void main(String[] args) {
Example ex1 = new Example(1);
Example ex2 = new Example(2);
ex1.printCount(); // 출력: count : 1
ex2.printCount(); // 출력: count : 2
}
}
int count;
객체 내부에 생성된 인스턴스 변수입니다
public Example(int count) { this.count = count; }
매개변수로 들어온 count 를 인스턴스 변수인 count 에 대입해줍니다
Example ex1 = new Example(1);
Example ex2 = new Example(2);
ex1.printCount();
ex2.printCount();
count 는 인스턴스 변수이기 때문에 각각의 객체에 따로 존재합니다.
그렇기 때문에
ex1 의 count 는 1
ex2 의 count 는 2 가 출력됩니다.
count 는 힙 영역에 저장되며, ex1 과 ex2 가 GC 에 의해 제거될 때까지 존재합니다.
3. 지역 변수
- 메서드 내에서 선언됩니다.
- 스택 영역에 저장됩니다.
- 메서드가 호출될 때 생성되고, 메서드가 종료되면 자동으로 소멸됩니다.
- 매개변수도 지역 변수의 일종입니다 !
- 반드시 초기화해야 사용할 수 있습니다.
예시를 통해서 알아보도록 하겠습니다 !
class Calculator {
public void add(int a, int b) { // a, b는 매개변수 (지역 변수)
int sum = a + b; // 지역 변수
System.out.println("합계: " + sum);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
calc.add(10, 20); // 출력: 합계: 30
}
}
public void add(int a, int b) { int sum = a + b; System.out.println("합계: " + sum); }
a, b, sum 모두 지역 변수입니다.
add 메서드가 호출될 때 스택 프레임이 생성되며 저장됩니다.
calc.add(10, 20);
add 메서드가 호출되고, 종료되면
a, b, sum 이 저장된 스택 프레임이 제거되면서 지역 변수도 사라집니다.
4. 총정리
변수 종류 | 저장 위치 | 생명 주기 | 특징 |
클래스 변수 | 메서드 영역 | 클래스 로딩시 생성 프로그램 종료 시 소멸 |
모든 객체가 공유 static 키워드 |
인스턴스 변수 | 힙 영역 | 객체가 생성될 때 할당 객체가 소멸되면 소멸 |
객체마다 개별적으로 할당 |
지역 변수 | 스택 영역 | 메서드가 호출될 때 생성 메서드가 종료될 때 제거 |
반드시 초기화 필요 (매개변수 제외) |