[JAVA] 클래스 변수와 인스턴스 변수의 이해

COMGONG_STONE·2024년 11월 8일

JAVA

목록 보기
2/3

소개

클래스는 객체를 생성하기 위한 설계도이자 틀이며, 인스턴스는 그 클래스에 의해 실제로 생성된 객체이다.

자바에서는 변수의 종류가 클래스 변수, 인스턴스 변수, 지역 변수 등 총 3가지가 있다. 이 중 클래스 변수와 인스턴스 변수를 통칭하여 멤버 변수라고 한다.

class Test {
    int a;         // 인스턴스 변수
    static int b;  // 클래스 변수 (static 변수, 공유 변수)

    // 메서드 영역
    void method() {
        int a = 0; // 지역 변수
    }
}

이번 글에서는 멤버 변수에 대해 자세히 알아보고, 이 둘의 차이점을 비교해보려고 한다.

클래스 변수

클래스 변수는 클래스 수준에서 공유되며, 모든 인스턴스가 동일한 값을 참조하는 변수를 의미한다. 이러한 클래스 변수는 static 키워드를 사용하여 클래스 내부에서 선언한다.

클래스 변수 특징

  1. 단일 존재

    클래스 변수는 메모리에서 단 하나만 존재하며, 클래스에 속한 모든 인스턴스가 동일한 데이터에 접근할 수 있다.

  2. 공유 데이터

    클래스 변수는 모든 인스턴스가 공통된 저장 공간을 공유하기 때문에, 한 클래스의 모든 인스턴스가 공통적인 값을 유지해야 하는 경우 클래스 변수로 선언하는 것이 좋다.

  3. 직접 접근 가능

    이러한 클래스 변수는 인스턴스를 생성하지 않고도 바로 사용할 수 있는 특징이 있다. "클래스이름.클래스변수"와 같은 형식으로 사용한다.

  4. 전역 변수 성격

    만약 public 키워드를 앞에 붙이면, 같은 프로그램 내에서 어디서나 접근할 수 있는 전역 변수의 성격을 갖게 된다.

예시

class Library {
    static int totalBooks = 1000; // 클래스 변수: 총 도서 수를 나타내는 클래스 변수

    void displayTotalBooks() {
        System.out.println("Total books in the library: " + totalBooks); // 직접 접근 가능
    }

    static void updateTotalBooks(int newTotal) {
        totalBooks = newTotal; // 클래스 변수의 값을 업데이트
    }
}

public class Main {
    public static void main(String[] args) {
        Library library1 = new Library();
        Library library2 = new Library();

        library1.displayTotalBooks(); // 출력: Total books in the library: 1000
        library2.displayTotalBooks(); // 출력: Total books in the library: 1000

        // 클래스 변수는 모든 인스턴스가 공유하므로, 한 인스턴스에서 변경하면 다른 인스턴스에도 영향을 미친다.
        Library.updateTotalBooks(1500); // 클래스 변수의 값 업데이트
        library1.displayTotalBooks(); // 출력: Total books in the library: 1500
        library2.displayTotalBooks(); // 출력: Total books in the library: 1500
    }
}

인스턴스 변수

인스턴스 변수는 각 객체에 고유하게 존재하며, 객체의 상태를 나타내는 데 사용되는 변수이다. 인스턴스 변수는 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.

인스턴스 변수 특징

  1. 객체별 존재

    인스턴스 변수는 각 객체마다 별도로 존재하므로, 객체의 개별적인 상태를 저장한다. 인스턴스를 생성할 때마다 새로운 저장 공간이 할당되어 서로 다른 값을 가질 수 있다.

  2. 상태 표현

    인스턴스 변수는 객체의 속성이나 상태를 나타내는 데 사용되며, 각 객체가 가진 고유한 정보를 유지한다. 이를 통해 각 인스턴스는 독립적으로 상태를 관리할 수 있다.

  3. 생성 필요

    인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다. 인스턴스 없이 인스턴스 변수에 접근할 수 없다.

  4. 독립적인 저장 공간

    각 인스턴스는 독립적인 저장 공간을 가지므로, 인스턴스마다 서로 다른 값을 유지할 수 있다.

예시

class Person {
    // 인스턴스 변수: 각 객체의 이름을 저장
    String name;
    // 인스턴스 변수: 각 객체의 나이를 저장
    int age;

    // 생성자: 인스턴스 변수 초기화
    Person(String name, int age) {
        this.name = name; // 상태 표현
        this.age = age;   // 상태 표현
    }

    // 인스턴스 변수의 값을 출력하는 메서드
    void displayInfo() {
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        // 인스턴스 생성
        Person person1 = new Person("Alice", 30); // 첫 번째 인스턴스
        Person person2 = new Person("Bob", 25);   // 두 번째 인스턴스

        // 각 인스턴스의 상태를 출력
        person1.displayInfo(); // 출력: Name: Alice, Age: 30
        person2.displayInfo(); // 출력: Name: Bob, Age: 25
    }
}

클래스 변수와 인스턴스 변수의 차이점

특성클래스 변수인스턴스 변수
선언 위치클래스 영역클래스 내부
생성 시기클래스가 메모리에 올라갔을 때인스턴스가 생성되었을 때
특징모든 인스턴스가 동일한 값을 공유, 클래스 수준에서 공통된 데이터 관리각 객체에 고유하게 존재, 객체의 상태를 나타냄
접근 방식인스턴스를 생성하지 않고도 직접 접근 가능 (예: 클래스이름.클래스변수)인스턴스를 생성해야만 접근 가능

결론

클래스 변수와 인스턴스 변수는 객체 지향 프로그래밍에서 중요한 역할을 하며, 각기 다른 용도로 사용된다.

클래스 변수는 공통 데이터를 관리하는 데 적합하고, 인스턴스 변수는 객체의 개별 상태를 유지하는 데 적합하다.

참고 문서

[Java/자바] 클래스 변수, 인스턴스 변수, 지역 변수란?

profile
컴공돌멩이

0개의 댓글