[Java] 클래스 변수와 인스턴스 변수

artp·2025년 2월 25일

java

목록 보기
17/32
post-thumbnail

인스턴스 변수란?

인스턴스 변수란 객체가 생성될 때 함께 생성되는 변수를 의미합니다. 인스턴스 변수는 각 인스턴스에 속하며, 인스턴스 변수마다 독립적인 값을 가집니다. 클래스 내부에서 선언되지만, static 키워드가 없습니다.
인스턴스 변수는 인스턴스를 통해 접근해야 하며, 인스턴스화가 필요합니다. 이는 인스턴스 변수가 인스턴스에 속하기 때문입니다.

인스턴스 변수 특징

  • 각 개체마다 개별적으로 존재 (독립적인 값을 가짐)
  • Heap 메모리에 저장됨 (객체가 생성될 때 같이 생성됨)
  • 객체가 제거되면 해당 변수도 함께 제거됨
  • 초기화하지 않아도 자동으로 기본값이 할당됨

예제: 인스턴스 변수

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(메서드 영역)에 저장됩니다. 모든 객체가 동일한 값을 공유하며, 프로그램이 실행될 때(클래스가 로딩될 때) 한 번만 생성되고, 프로그램이 종료될 때까지 유지됩니다.

클래스 변수는 클래스명.변수명으로 접근할 수 있으며, 인스턴스화 없이 사용할 수 있습니다. 이는 클래스 변수가 클래스 자체에 속하기 때문입니다.

클래스 변수 특징

  • 객체를 생성하지 않아도 사용 가능 (클래스명.변수명으로 접근 가능)
  • 모든 객체가 같은 값을 공유
  • Method Area(메서드 영역)에 저장됨
  • 초기화하지 않으면 기본값이 자동으로 할당됨

예제: 클래스 변수 vs 인스턴스 변수

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

인스턴스 변수 vs 클래스 변수(static) 차이점

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에 의해 삭제될 때프로그램 종료 시까지 유지
profile
donggyun_ee

0개의 댓글