들어가며
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 메서드 활용 예이다.
'-- 오늘 있었던 개발 일기' 카테고리의 다른 글
| 컴파일 언어란? - 그리고 Java는 어떻게 다를까? (0) | 2026.04.12 |
|---|---|
| 매개변수(Parameter)란? (1) | 2026.04.11 |
| 참조변수는 주소를 가져야 한다! (0) | 2026.04.08 |
| Object 클래스 - Java 최상위 클래스 (0) | 2026.04.06 |
| 상대경로와 절대경로 (0) | 2026.04.04 |