클래스는 객체를 생성하기 위한 설계도이자 틀이며, 인스턴스는 그 클래스에 의해 실제로 생성된 객체이다.
자바에서는 변수의 종류가 클래스 변수, 인스턴스 변수, 지역 변수 등 총 3가지가 있다. 이 중 클래스 변수와 인스턴스 변수를 통칭하여 멤버 변수라고 한다.
class Test {
int a; // 인스턴스 변수
static int b; // 클래스 변수 (static 변수, 공유 변수)
// 메서드 영역
void method() {
int a = 0; // 지역 변수
}
}
이번 글에서는 멤버 변수에 대해 자세히 알아보고, 이 둘의 차이점을 비교해보려고 한다.
클래스 변수는 클래스 수준에서 공유되며, 모든 인스턴스가 동일한 값을 참조하는 변수를 의미한다. 이러한 클래스 변수는 static 키워드를 사용하여 클래스 내부에서 선언한다.
단일 존재
클래스 변수는 메모리에서 단 하나만 존재하며, 클래스에 속한 모든 인스턴스가 동일한 데이터에 접근할 수 있다.
공유 데이터
클래스 변수는 모든 인스턴스가 공통된 저장 공간을 공유하기 때문에, 한 클래스의 모든 인스턴스가 공통적인 값을 유지해야 하는 경우 클래스 변수로 선언하는 것이 좋다.
직접 접근 가능
이러한 클래스 변수는 인스턴스를 생성하지 않고도 바로 사용할 수 있는 특징이 있다. "클래스이름.클래스변수"와 같은 형식으로 사용한다.
전역 변수 성격
만약 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
}
}
인스턴스 변수는 각 객체에 고유하게 존재하며, 객체의 상태를 나타내는 데 사용되는 변수이다. 인스턴스 변수는 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
객체별 존재
인스턴스 변수는 각 객체마다 별도로 존재하므로, 객체의 개별적인 상태를 저장한다. 인스턴스를 생성할 때마다 새로운 저장 공간이 할당되어 서로 다른 값을 가질 수 있다.
상태 표현
인스턴스 변수는 객체의 속성이나 상태를 나타내는 데 사용되며, 각 객체가 가진 고유한 정보를 유지한다. 이를 통해 각 인스턴스는 독립적으로 상태를 관리할 수 있다.
생성 필요
인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다. 인스턴스 없이 인스턴스 변수에 접근할 수 없다.
독립적인 저장 공간
각 인스턴스는 독립적인 저장 공간을 가지므로, 인스턴스마다 서로 다른 값을 유지할 수 있다.
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
}
}
| 특성 | 클래스 변수 | 인스턴스 변수 |
|---|---|---|
| 선언 위치 | 클래스 영역 | 클래스 내부 |
| 생성 시기 | 클래스가 메모리에 올라갔을 때 | 인스턴스가 생성되었을 때 |
| 특징 | 모든 인스턴스가 동일한 값을 공유, 클래스 수준에서 공통된 데이터 관리 | 각 객체에 고유하게 존재, 객체의 상태를 나타냄 |
| 접근 방식 | 인스턴스를 생성하지 않고도 직접 접근 가능 (예: 클래스이름.클래스변수) | 인스턴스를 생성해야만 접근 가능 |
클래스 변수와 인스턴스 변수는 객체 지향 프로그래밍에서 중요한 역할을 하며, 각기 다른 용도로 사용된다.
클래스 변수는 공통 데이터를 관리하는 데 적합하고, 인스턴스 변수는 객체의 개별 상태를 유지하는 데 적합하다.