☕️ 자바

헷갈리는 자바 변수 정리 - 클래스 변수 , 인스턴스 변수 , 지역 변수

mallin 2025. 2. 5. 23:42

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 키워드
인스턴스 변수 힙 영역 객체가 생성될 때 할당
객체가 소멸되면 소멸
객체마다 개별적으로 할당
지역 변수 스택 영역 메서드가 호출될 때 생성
메서드가 종료될 때 제거
반드시 초기화 필요 (매개변수 제외)