클래스 메소드와 인스턴스 메소드
클래스 메소드와 인스턴스 메소드란?
자바 메소드는 static 키워드 유무에 따라 클래스 메소드(static method)와 인스턴스 메소드(instance method)로 나뉩니다.
- 클래스 메소드 → 클래스 로딩과 동시에 메모리에 올라가며, 객체 생성 없이 호출 가능
- 인스턴스 메소드 → 객체 각각의 상태를 다루며, new 연산자로 인스턴스를 만든 뒤에만 호출 가능
클래스 메소드 static
언제 사용할까?
- 객체 상태에 의존하지 않고 고정된 작업을 수행할 때
- 공통 상수·전역 설정·유틸리티 함수 작성 시
핵심 포인트
- 클래스 변수(static 변수)만 접근 가능
this사용 ❌- 메서드 영역(Method Area)에 저장 → 애플리케이션 종료까지 유지
class MathUtil {
static int add(int a, int b) { // 클래스 메소드
return a + b;
}
}
// 호출
int sum = MathUtil.add(10, 20);
인스턴스 메소드
언제 사용할까?
- 객체 고유 속성을 읽거나 바꿔야 할 때
- 다형성을 활용해 행동을 오버라이딩할 때
핵심 포인트
- 클래스 변수 + 인스턴스 변수 모두 사용 가능
- 호출 전 객체 생성 필수
- 힙(Heap) 영역에 객체가 사라질 때까지 존재
class Counter {
int value; // 인스턴스 변수
int increment() { // 인스턴스 메소드
return ++value;
}
}
// 호출
Counter c1 = new Counter();
System.out.println(c1.increment());
메모리·수명 비교
| 구분 | 메모리 위치 | 생성 시점 | 소멸 시점 | 접근 대상 |
|---|---|---|---|---|
| 클래스 메소드 | 메서드 영역 | 클래스 로드 | JVM 종료 | 클래스 변수 |
| 인스턴스 메소드 | 힙(객체 내부) | 인스턴스 생성 | 객체 GC | 모든 변수 |
실전 예제 – 자동차 관리 프로그램
class Car {
// 클래스 변수
static int totalCars = 0;
// 인스턴스 변수
String model;
// 클래스 메소드
static void addCarCount() {
totalCars++;
}
// 인스턴스 메소드
void setModel(String modelName) {
model = modelName;
}
}
// 사용
Car.addCarCount();
Car car1 = new Car();
car1.setModel("Sedan");
Car.addCarCount();
System.out.println("총 차량: " + Car.totalCars); // 2
System.out.println("모델명: " + car1.model); // Sedan
설계 팁 ✔️
| 상황 | 추천 메소드 |
|---|---|
| 전역 상수·설정, 유틸 기능 | 클래스 메소드 |
| 객체 데이터 읽기·변경 | 인스턴스 메소드 |
| 팩토리 메소드(객체 생성 책임) | static + 생성자 은닉 |
TIP: static 메소드가 많아지면 테스트 어려움·상태 관리 혼란이 생길 수 있으므로 필요할 때만 사용하세요.
질문 정리
-
static메소드 안에서 인스턴스 변수를 못 쓰는 이유는?인스턴스가 없어도 호출되기 때문에, 객체 주소(
this)가 존재하지 않습니다. -
인스턴스 메소드에서
static변수를 수정해도 되나요?가능하지만 여러 객체가 공유하므로 동기화 문제에 주의하세요.
-
static메소드도 오버라이딩할 수 있나요?불가능합니다.
static은 클래스 레벨에 묶여 있어 하위 클래스에서 숨김(hiding)만 일어납니다. -
성능 차이가 있나요?
JIT 최적화로 대부분 미미하지만,
static메소드는 가상 메소드 테이블을 거치지 않아 약간 빠를 수 있습니다. -
언제든
static을 붙여도 괜찮을까요?테스트·모킹·확장성을 생각하면, 객체 상태를 쓰지 않는 순수 함수에만 제한적으로 사용하는 것이 좋습니다.
핵심 요약
- 클래스 메소드 → 객체 독립 유틸·전역 데이터
- 인스턴스 메소드 → 객체 상태 조작·다형성 구현
댓글남기기