Journey to CS/프로그래밍 언어

[Java] static과 인스턴스 - JVM이 main 메서드를 찾아가는 방법

Cordilog 2026. 2. 26. 18:15

public, static, 그리고 new 이 세 가지 키워드는 자바의 동작 원리와 메모리 관리 방식을 이해하는 데 중요하다.

각 키워드의 역할과 객체 생성 과정에서의 메모리 흐름을 살펴본다.

 

1. main 메서드가 public이어야 하는 이유

JVM(Java Virtual Machine)이 프로그램을 실행할 때, 클래스 외부에서 main 메서드를 찾아 호출해야 한다.

만약 main 메서드가 public이 아니라면 JVM은 해당 메서드에 접근할 수 없으며, 프로그램은 시작을 할 수 없다.

따라서 main은 항상 외부로 완전히 개방된 public 상태여야 한다.

 

default 접근 제어

메서드 앞에 아무런 제어자도 붙이지 않으면 자동으로 default 상태가 된다.

이는"같은 패키지 내부"에서만 접근이 가능하다는 뜻이다.

내부적인 보조 로직이나 패키지 안에서만 공유할 기능에는 굳이 public을 붙이지 않는 것이 객체지향의 캡슐화(Encapsulation) 원칙에 부합한다.

 

2. 인스턴스가 아닌 클래스에 귀속시키는 static

static 키워드는 메서드나 변수를 객체(Object)가 아닌 클래스 자체에 고정시킨다.

  • 정적 영역(Method Area): static이 붙은 자원은 프로그램이 시작될 때 메모리의 정적 영역에 단 한 번 로드된다.
  • 객체 생성 불필요: new를 통해 객체를 만들지 않아도 클래스 이름만으로 즉시 호출이 가능하다.
  • 공유 자원: 해당 클래스로부터 생성된 모든 객체가 동일한 static 변수를 공유한다.

 

3. new와 참조 변수: 객체의 탄생과 연결

 

static이 없는 일반 메서드나 변수를 사용하려면 반드시 new 키워드를 사용해야 한다.

이를 통해 인스턴스(Instance)가 생성된다.

 

코드 예시: Robot 클래스

로봇의 이름(개별 속성)과 생산된 로봇의 총 개수(공유 속성)를 관리하는 코드

public class Robot {
    // static 변수: 모든 로봇이 공유하는 총 생산량
    static int totalCount = 0;
    
    // 인스턴스 변수: 각 로봇마다 가지는 고유한 이름
    String name;

    // 인스턴스 메서드: 로봇의 이름을 출력
    void sayHello() {
        System.out.println("안녕, 나는 " + name + "이야.");
    }

    public static void main(String[] args) {
        // 1. static 자원은 객체 생성 없이 바로 접근 가능
        Robot.totalCount = 2;

        // 2. new를 통해 힙(Heap) 영역에 객체 생성
        Robot r1 = new Robot();
        r1.name = "알파";

        Robot r2 = new Robot();
        r2.name = "베타";

        // 3. 각 객체는 자신만의 데이터를 가짐
        r1.sayHello(); // 안녕, 나는 알파야.
        r2.sayHello(); // 안녕, 나는 베타야.
    }
}

 

4. 메모리 참조 관계

객체가 생성되고 메서드가 실행될 때, 자바 메모리는 크게 세 영역으로 나뉘어 작동한다.

  1. 메소드 영역(Method Area): 클래스 정보와 static 변수가 저장된다.
  2. 스택(Stack): 지역 변수와 참조 변수(r1, r2)가 저장된다.
  3. 힙(Heap): new로 생성된 실제 객체 데이터가 저장된다.

 

 

  • 참조(Reference): 스택에 있는 r1 변수는 실제 객체가 아니라, 힙 영역에 있는 객체의 메모리 주소를 들고 있다.
  • 연결: r1.name에 접근한다는 것은 r1이 가리키는 주소를 따라가서 힙에 저장된 데이터를 읽거나 쓰는 행위를 의미한다.

 

5. 정리

키워드 주요 특징 메모리 위치
public 외부(JVM 포함) 어디서든 접근 가능하도록 개방 -
static 객체 생성 없이 클래스명으로 접근, 프로그램 시작 시 로드 Method Area
new 힙 영역에 새로운 객체를 할당하고 그 주소를 반환 Heap

 

자바 프로그램에서 main 메서드에 public static이 붙는 이유는 JVM이 객체 생성이라는 복잡한 절차 없이도 가장 먼저 프로그램에 접근할 수 있도록 하기 위함이다.

반면, 프로그램 내부의 비즈니스 로직은 new를 통해 객체를 생성함으로써 각기 다른 상태를 가진 유연한 구조로 설계된다.