Java

JAVA 기초 정리 - static과 인스턴스 멤버란?

chungmani 2026. 6. 5. 20:38

 

자바를 공부하다 보면 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, 객체마다 달라야 하면 인스턴스" 라고 생각하니 이해가 훨씬 쉬웠다.