클래스 변수란?
클래스 변수는 해당 클래스를 통해 생성된 모든 인스턴스가 공유하는 변수입니다. 즉, 인스턴스가 100개든 1000개든, 모두 같은 값을 공유하고 있습니다.
클래스 변수의 선언
class MyClass {
static int count = 0; // 클래스 변수
}
클래스 변수는 static 키워드를 붙여 선언합니다. 해당 코드는 int형 변수인 count를 클래스 변수로 선언한 코드입니다.
클래스 변수의 특징
- 클래스 로딩 시 메모리에 올라갑니다.
- 객체를 생성하지 않아도 MyClass.count처럼 클래스명으로 직접 접근할 수 있습니다.
- 모든 인스턴스가 동일한 값을 공유합니다.
인스턴스 변수란?
인스턴스 변수란, 클래스 내부에서 선언되고, 각각의 객체가 독립적으로 가지는 변수입니다. 즉, 객체(Object)가 만들어질 때마다 새로 생성되며, 다른 객체들과 서로 다른 값을 가질 수 있는 변수입니다.
인스턴스 변수의 선언
class MyClass {
int count = 0; // 인스턴스 변수
}
인스턴스 변수의 선언 방법은 클래스 변수와 다르게 static 없이 변수타입, 변수명으로 선언합니다. 해당 코드는 int형 변수인 count 를 인스턴스 변수로 선언한 코드입니다.
인스턴스 변수의 특징
- 객체가 생성될 때마다 메모리에 할당됩니다.
- 반드시 객체가 생성되어야 접근할 수 있습니다.
- 각 인스턴스마다 독립적인 값을 가집니다.
실습 예제
예제를 통해 클래스변수가 어떻게 동작하는지 직접 확인해보겠습니다.
- 실습 예제 -
* Student 클래스
public class Student {
static int count = 0; // 클래스 변수 (모든 객체가 공유)
String name = ""; // 인스턴스 변수 (객체마다 다름)
public Student(String name) {
this.name = name;
count++;
System.out.println(name + " 학생이 등록되었습니다.");
}
public void introduce() {
System.out.println("안녕하세요, 저는 " + name + "입니다.");
}
/* 클래스 변수 메서드 */
public static void printStudentCount() {
System.out.println("현재 등록된 학생 수: " + count + "명");
}
}
* School 클래스
public class School {
public static void main(String[] args) {
Student s1 = new Student("지민");
Student s2 = new Student("영수");
Student s3 = new Student("하늘");
s1.introduce();
s2.introduce();
s3.introduce();
// 클래스 변수는 클래스명으로 접근 가능
Student.printStudentCount();
}
}
- 출력 결과 -
지민 학생이 등록되었습니다.
영수 학생이 등록되었습니다.
하늘 학생이 등록되었습니다.
안녕하세요, 저는 지민입니다.
안녕하세요, 저는 영수입니다.
안녕하세요, 저는 하늘입니다.
현재 등록된 학생 수: 3명
해당 실습 예제의 주요 코드를 살펴보겠습니다.
Student s1 = new Student("...")
Student 객체 생성과 count++ 구문이 실행됩니다. 클래스 변수인 count가 증가됩니다. 따라서 모든 객체가 같은 값을 공유하고 있습니다.
s1.introduce()
각 객체의 name을 출력합니다. Student 클래스의 name은 인스턴스 변수입니다. 따라서 각 객체의 name은 다릅니다.
Student.printStudentCount()
클래스 변수 count 출력합니다. Student 클래스의 printStudentCount 메서드는 static으로 선언된 메서드입니다. static 메서드는 객체 없이도 클래스 이름으로 호출 가능합니다. 따라서 변수나 메서드를 접근할 때는 "클래스명. 변수명(메서드명)"으로 접근 가능합니다.
마무리 정리
클래스 변수와 인스턴스 변수의 차이
한줄로 요약하자면 클래스 변수는 공통된 값, 인스턴스변수는 객체 고유의 값을 다룰때 사용합니다.
클래스 변수를 사용하는 경우
- 전체 인스턴스가 공통으로 써야하는 값이 있을 때
- 전체 사용자 수 (userCount), 프로그램 버전 등
- 값을 객체 없이도 써야 할 때
- 설정 값, 상수 (PIE) 등
- 유틸리티 클래스 메서드
- Math.pow(), Utils.formatDate() 등
인스턴스 변수를 사용하는 경우
- 객체마다 다른 값을 저장해야 할 때
- 학생 이름, 나이, 자동차 속도 등
- 객체의 고유 상태를 유지해야 할 때
- 주문번호, 로그인 사용자 정보 등
- 특정 객체에만 적용되는 정보일 때
- 게시글 제목, 댓글 내용 등
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 13. 클래스 메서드와 인스턴스 메서드 (0) | 2025.04.03 |
---|---|
[Java] 12. 메서드란? (0) | 2025.04.02 |
[Java] 10. 캡슐화란? (0) | 2025.03.27 |
[Java] 09. 클래스와 객체와 인스턴스 (1) | 2025.03.26 |
[Java] 08. 객체 지향과 절차 지향의 차이 (0) | 2024.05.07 |