JAVA

자바 static — 객체 없이 쓰는 공용 멤버(STATIC)

PANCO_IT
#자바#JAVA#static#정적멤버#클래스변수

인스턴스 멤버와 static 멤버를 비교한 그림

인스턴스 멤버는 객체마다 따로, static 멤버는 클래스에 딱 하나입니다.

지금까지는 new로 객체를 만든 뒤 그 객체의 필드와 메서드를 썼습니다. 객체마다 필드가 따로 있었죠. 그런데 "모든 객체가 함께 쓰는 값 하나"가 필요할 때가 있습니다. 예를 들어 지금까지 만든 강아지가 몇 마리인지 세는 카운터처럼요. 이럴 때 쓰는 것이 오늘의 주제, static입니다.

static이 뭔가요?

static은 객체가 아니라 클래스에 딱 하나만 존재하는 공용 멤버입니다. 모든 객체가 그 하나를 함께 나눠 씁니다. 객체를 만들지 않아도 쓸 수 있습니다.

쉽게 — 교실의 '공용 게시판'과 같습니다. 학생마다 개인 노트(인스턴스 필드)는 따로지만, 게시판(static)은 교실에 하나뿐이라 모두가 같은 것을 봅니다. 한 사람이 게시판에 글을 붙이면 모두에게 보이죠. static도 이렇게 모두가 공유하는 하나입니다.

인스턴스 멤버 vs static 멤버

둘의 차이는 '몇 개가 있느냐'입니다. 인스턴스 필드는 객체마다 하나씩 생기고, static 필드는 클래스에 딱 하나만 생겨 공유됩니다.

class Dog {
    static int count = 0;   // 공용: 모든 Dog이 하나를 공유
    String name;            // 개별: 객체마다 따로
}

name은 강아지마다 다르지만, count는 Dog 전체에 하나뿐입니다. 강아지가 100마리여도 count는 하나입니다.

static의 세 가지 특징: 공유, 객체 없이 사용, 클래스명으로 접근

그림 1. 모두가 공유하고, 객체 없이 쓰며, 클래스 이름으로 접근합니다.

객체 없이, 클래스 이름으로 부른다

인스턴스 멤버는 객체.멤버로 썼습니다(d.name). static 멤버는 객체를 만들 필요 없이 **클래스.멤버**로 씁니다.

System.out.println(Dog.count);   // 클래스 이름으로 바로 접근

우리가 자주 본 Math.max(3, 5)Math.random()도 같은 방식입니다. Math 객체를 만든 적이 없죠. maxrandom이 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가 어떻게 바뀌는지 확인해 보세요.

static 공용 카운터
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 메서드에서는 인스턴스 필드를 바로 쓸 수 없습니다.

미니 퀴즈

개념을 제대로 잡았는지 직접 풀어 봅니다. 정답은 눌러야 나옵니다.

미니 퀴즈

OX 2문제 + 4지선다 3문제


포켓코딩(JAVA2) 6편 · 예제 출처: 강사 개인 GitHub 저장소. 다음 편: 상속 — 기존 클래스를 물려받아 확장하기.

PANCO_IT

IT 지식을 정리하는 개발자

관련 글