자바를 공부하다 보면 static이라는 키워드를 자주 만나게 된다.
처음에는 "왜 객체도 안 만들었는데 사용할 수 있지?"라는 생각이 들었는데, 정리해보니 생각보다 단순한 개념이었다.
static이란?
static은 클래스에 소속된 변수나 메서드를 만들 때 사용하는 키워드이다.
일반적인 변수와 메서드는 객체를 생성해야 사용할 수 있지만, static이 붙은 변수와 메서드는 객체를 만들지 않아도 사용할 수 있다.
public class Person {
// static 변수
static int population = 0;
// static 메서드
static void printPopulation() {
System.out.println("현재 인구수: " + population);
}
}
사용할 때도 객체를 생성하지 않는다.
public class Main {
public static void main(String[] args) {
System.out.println("static 변수 활용 : " + Person.population);
Person.printPopulation();
}
}
실행 결과
static 변수 활용 : 0
현재 인구수: 0
static은 왜 객체 생성 없이 사용할 수 있을까?
프로그램이 실행되면 static 변수와 메서드는 객체가 생성되기 전에 메모리에 먼저 올라간다.
정확히는 JVM의 Method Area(메서드 영역) 에 저장된다.
그래서 객체를 생성하지 않아도 클래스 이름만으로 접근할 수 있다.
Person.population
Person.printPopulation()
static은 언제 사용할까?
모든 객체가 함께 사용해야 하는 데이터가 있을 때 사용한다.
예를 들어 사람 객체를 여러 개 만들더라도 "전체 인구수"는 하나만 존재해야 한다.
static int population;
이처럼 모든 객체가 공유해야 하는 값은 static으로 관리하는 것이 적절하다.
인스턴스 멤버란?
인스턴스 멤버는 다음 두 가지를 말한다.
- 인스턴스 변수
- 인스턴스 메서드
public class Person {
// 인스턴스 변수
String name;
// 인스턴스 메서드
void printName() {
System.out.println("나의 이름은 " + this.name + "입니다.");
}
}
인스턴스 멤버의 특징
인스턴스 멤버는 객체마다 개별적으로 존재한다.
즉, 객체마다 서로 다른 값을 가질 수 있다.
Person p1 = new Person();
p1.name = "채원";
p1.printName();
실행 결과
나의 이름은 채원입니다.
만약 객체를 하나 더 생성한다면?
Person p1 = new Person();
p1.name = "채원";
Person p2 = new Person();
p2.name = "은채";
각 객체는 자신의 name 값을 따로 가지고 있게 된다.
따라서 인스턴스 변수는 공유되지 않는다.
인스턴스 멤버는 어디에 저장될까?
객체를 생성하면 객체 정보는 Heap 영역 에 저장된다.
따라서 인스턴스 변수와 인스턴스 메서드는 객체와 함께 존재하며, 객체마다 각각 생성된다.
static과 인스턴스 멤버 비교
구분static 멤버인스턴스 멤버
| 소속 | 클래스 | 객체 |
| 생성 시점 | 프로그램 시작 시 | 객체 생성 시 |
| 저장 위치 | Method Area | Heap |
| 객체 생성 필요 여부 | 필요 없음 | 필요 |
| 공유 여부 | 모든 객체가 공유 | 객체마다 개별 보유 |
정리
- static은 클래스에 소속된 공용 변수와 메서드를 만들 때 사용한다.
- static 멤버는 객체 생성 없이 사용할 수 있다.
- static 멤버는 모든 객체가 함께 공유한다.
- 인스턴스 멤버는 객체마다 따로 생성된다.
- 인스턴스 멤버는 서로 공유되지 않는다.
- 공통 데이터는 static, 객체별 데이터는 인스턴스 멤버로 관리한다.
개인적으로는 "모든 객체가 같이 써야 하면 static, 객체마다 달라야 하면 인스턴스" 라고 생각하니 이해가 훨씬 쉬웠다.
'Java' 카테고리의 다른 글
| JAVA 기초정리 - 다형성과 예외처리 (0) | 2026.06.09 |
|---|---|
| JAVA 기초 정리 - 객체지향 (final, 인터페이스, 캡슐화, 상속) (0) | 2026.06.08 |
| JAVA 기초 정리 - 래퍼 클래스(Wrapper Class) (0) | 2026.05.21 |
| JAVA 기초 정리 - JVM 메모리 영역 (0) | 2026.05.20 |
| JAVA 기초 정리 - 클래스(Class)와 객체(Object) (0) | 2026.05.19 |