
인스턴스 멤버는 객체마다 따로, static 멤버는 클래스에 딱 하나입니다.
지금까지는 new로 객체를 만든 뒤 그 객체의 필드와 메서드를 썼습니다. 객체마다 필드가 따로 있었죠. 그런데 "모든 객체가 함께 쓰는 값 하나"가 필요할 때가 있습니다. 예를 들어 지금까지 만든 강아지가 몇 마리인지 세는 카운터처럼요. 이럴 때 쓰는 것이 오늘의 주제, static입니다.
static이 뭔가요?
static은 객체가 아니라 클래스에 딱 하나만 존재하는 공용 멤버입니다. 모든 객체가 그 하나를 함께 나눠 씁니다. 객체를 만들지 않아도 쓸 수 있습니다.
쉽게 — 교실의 '공용 게시판'과 같습니다. 학생마다 개인 노트(인스턴스 필드)는 따로지만, 게시판(static)은 교실에 하나뿐이라 모두가 같은 것을 봅니다. 한 사람이 게시판에 글을 붙이면 모두에게 보이죠. static도 이렇게 모두가 공유하는 하나입니다.
인스턴스 멤버 vs static 멤버
둘의 차이는 '몇 개가 있느냐'입니다. 인스턴스 필드는 객체마다 하나씩 생기고, static 필드는 클래스에 딱 하나만 생겨 공유됩니다.
class Dog {
static int count = 0; // 공용: 모든 Dog이 하나를 공유
String name; // 개별: 객체마다 따로
}
name은 강아지마다 다르지만, count는 Dog 전체에 하나뿐입니다. 강아지가 100마리여도 count는 하나입니다.

그림 1. 모두가 공유하고, 객체 없이 쓰며, 클래스 이름으로 접근합니다.
객체 없이, 클래스 이름으로 부른다
인스턴스 멤버는 객체.멤버로 썼습니다(d.name). static 멤버는 객체를 만들 필요 없이 **클래스.멤버**로 씁니다.
System.out.println(Dog.count); // 클래스 이름으로 바로 접근
우리가 자주 본 Math.max(3, 5)나 Math.random()도 같은 방식입니다. Math 객체를 만든 적이 없죠. max와 random이 static이라 클래스 이름으로 바로 부르는 것입니다.
static 메서드
필드뿐 아니라 메서드도 static일 수 있습니다. 객체 상태가 필요 없는 기능은 static으로 만들면 객체 없이 쓸 수 있어 편합니다.
static int add(int a, int b) {
return a + b;
}
사실 지금까지 계속 봐 온 public static void main도 static 메서드입니다. 프로그램 시작 시 객체가 없어도 실행돼야 하니 static인 것입니다.
단골 함정 — static에서 인스턴스 필드 못 씀
static 메서드 안에서는 인스턴스 필드를 바로 쓸 수 없습니다. static은 객체가 없어도 도는데, 인스턴스 필드는 객체가 있어야 존재하기 때문입니다.
class Dog {
String name;
static void hi() {
System.out.println(name); // 오류: 어느 객체의 name인지 알 수 없음
}
}
hi()는 객체 없이도 불릴 수 있어, "어느 강아지의 name?"이 정해지지 않습니다. 그래서 오류가 납니다. static 메서드에서는 static 멤버만 바로 쓸 수 있다고 기억하세요.
직접 실행해 보기
아래 코드를 돌려 보고, new Dog(...)를 더 추가하면 Dog.count가 어떻게 바뀌는지 확인해 보세요.
class Dog {
static int count = 0; // 모든 Dog이 공유
String name;
Dog(String name) {
this.name = name;
count++; // 객체가 생길 때마다 공용 카운트 증가
}
}
public class Main {
public static void main(String[] args) {
new Dog("바둑이");
new Dog("초코");
new Dog("몽이");
System.out.println(Dog.count); // 3 (객체 없이 클래스명으로 접근)
}
}📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.
한 장 정리
| 항목 | 인스턴스 멤버 | static 멤버 |
|---|---|---|
| 개수 | 객체마다 하나씩 | 클래스에 딱 하나 |
| 접근 | 객체.멤버 (d.name) | 클래스.멤버 (Dog.count) |
| 객체 필요? | 필요(new) | 불필요 |
| 쓰임 | 객체마다 다른 값 | 모두가 공유하는 값·기능 |
이것만 기억하면 됩니다. static은 클래스에 딱 하나뿐인 공용 멤버라, 모든 객체가 함께 쓰고 객체 없이 클래스.멤버로 접근합니다. 공유 카운터나 Math처럼 객체 상태가 필요 없는 값·기능에 씁니다. 단, static 메서드에서는 인스턴스 필드를 바로 쓸 수 없습니다.
미니 퀴즈
개념을 제대로 잡았는지 직접 풀어 봅니다. 정답은 눌러야 나옵니다.
미니 퀴즈
포켓코딩(JAVA2) 6편 · 예제 출처: 강사 개인 GitHub 저장소. 다음 편: 상속 — 기존 클래스를 물려받아 확장하기.