본문 바로가기
-- 오늘 있었던 개발 일기

static 메서드란? - 객체 생성 없이 바로 호출

by code study 2026. 4. 9.

들어가며

Java에서 메서드를 호출하려면 보통 객체를 먼저 생성해야 합니다.
하지만 static 키워드가 붙은 메서드는 객체 생성 없이 클래스 이름으로 바로 호출할 수 있습니다.
이 글에서는 static 메서드가 무엇인지, 왜 사용하는지, 주의할 점은 무엇인지 정리해보겠습니다.


static 메서드란?

static 메서드는 클래스에 소속된 메서드입니다.
일반 메서드는 객체(인스턴스)에 소속되지만, static 메서드는 클래스 자체에 소속됩니다.
그래서 객체를 만들지 않아도 클래스명.메서드명()으로 바로 호출할 수 있습니다.

// 일반 메서드 호출 - 객체 생성 필요
Calculator calc = new Calculator();
int result = calc.add(3, 5);

// static 메서드 호출 - 객체 생성 불필요
int result = Calculator.add(3, 5);

코드로 이해하기

class Calculator {

    // static 메서드 - 클래스에 소속
    public static int add(int a, int b) {
        return a + b;
    }

    public static int multiply(int a, int b) {
        return a * b;
    }
}

public class Main {
    public static void main(String[] args) {

        // 객체 생성 없이 클래스 이름으로 바로 호출
        int sum = Calculator.add(3, 5);
        int product = Calculator.multiply(4, 6);

        System.out.println(sum);     // 8
        System.out.println(product); // 24
    }
}

static 메서드와 메모리

static은 프로그램이 시작될 때 메서드 영역(Method Area) 에 딱 한 번 올라갑니다.
객체를 생성할 때마다 만들어지는 인스턴스 메서드와 달리, 모든 객체가 공유합니다.

[메서드 영역]               [힙]
┌──────────────────┐       ┌──────────────┐
│ Calculator.add() │       │ Calculator@1 │ (new로 생성)
│ (공유, 1개만 존재) │       │ Calculator@2 │ (new로 생성)
└──────────────────┘       └──────────────┘
    ↑
  클래스 이름으로 직접 접근 가능

static 메서드의 제약 - 인스턴스 멤버 접근 불가

static 메서드는 객체가 없어도 호출되기 때문에, 인스턴스 변수나 인스턴스 메서드에 접근할 수 없습니다.

class Member {
    String name; // 인스턴스 변수 - 객체마다 다름

    // 인스턴스 메서드 - 객체 필요
    public void printName() {
        System.out.println(name);
    }

    // static 메서드
    public static void greeting() {
        System.out.println(name);       // 컴파일 오류! 인스턴스 변수 접근 불가
        printName();                    // 컴파일 오류! 인스턴스 메서드 접근 불가
        System.out.println("안녕하세요"); // 가능 - 인스턴스 멤버 사용 안 함
    }
}

static 메서드는 static 변수와 static 메서드만 접근할 수 있습니다.

class Counter {
    static int count = 0; // static 변수

    public static void increment() {
        count++; // static 변수는 접근 가능
    }

    public static int getCount() {
        return count; // static 변수 반환 가능
    }
}

Counter.increment();
Counter.increment();
System.out.println(Counter.getCount()); // 2

 


일반 메서드 vs static 메서드

항목 일반(인스턴스) 메서드 static 메서드
호출 방법 객체 생성 후 호출 클래스 이름으로 바로 호출
메모리 위치 힙(객체마다 생성) 메서드 영역(1개만 존재)
인스턴스 변수 접근 가능 불가
사용 목적 객체 상태를 사용하는 기능 객체 상태와 무관한 공통 기능

언제 static 메서드를 쓸까?

static 메서드는 객체의 상태(인스턴스 변수)와 관계없이 항상 같은 동작을 하는 기능에 적합합니다.

// 유틸리티성 메서드 - 객체 상태와 무관
class StringUtil {
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }

    public static String toUpperCase(String str) {
        return str.toUpperCase();
    }
}

StringUtil.isEmpty("");         // true
StringUtil.toUpperCase("hello"); // "HELLO"

 

Java에서 자주 쓰는 Math, Arrays, Collections 클래스가 대표적인 예입니다.

Math.abs(-5);          // 5
Math.max(3, 7);        // 7
Arrays.sort(arr);      // 배열 정렬
Collections.shuffle(list); // 리스트 섞기

main 메서드가 static인 이유

Java 프로그램의 시작점인 main 메서드도 static입니다.

public static void main(String[] args) { ... }

프로그램이 시작될 때 JVM이 main을 호출해야 하는데,
아직 객체가 하나도 생성되지 않은 시점이기 때문에 객체 없이도 호출 가능한 static이어야 합니다.


정리

  • static 메서드는 클래스에 소속되어 객체 생성 없이 클래스명.메서드명()으로 바로 호출할 수 있다.
  • 프로그램 시작 시 메서드 영역에 한 번 올라가며 모든 객체가 공유한다.
  • static 메서드 안에서는 인스턴스 변수와 인스턴스 메서드에 접근할 수 없다.
  • 객체 상태와 무관하게 항상 같은 동작을 하는 유틸리티 기능에 적합하다.
  • Math, Arrays, Collections 클래스의 메서드들이 대표적인 static 메서드 활용 예이다.