2 분 소요

클래스 메소드와 인스턴스 메소드란?

자바 메소드는 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 메소드가 많아지면 테스트 어려움·상태 관리 혼란이 생길 수 있으므로 필요할 때만 사용하세요.


질문 정리

  1. static 메소드 안에서 인스턴스 변수를 못 쓰는 이유는?

    인스턴스가 없어도 호출되기 때문에, 객체 주소(this)가 존재하지 않습니다.

  2. 인스턴스 메소드에서 static 변수를 수정해도 되나요?

    가능하지만 여러 객체가 공유하므로 동기화 문제에 주의하세요.

  3. static 메소드도 오버라이딩할 수 있나요?

    불가능합니다. static은 클래스 레벨에 묶여 있어 하위 클래스에서 숨김(hiding)만 일어납니다.

  4. 성능 차이가 있나요?

    JIT 최적화로 대부분 미미하지만, static 메소드는 가상 메소드 테이블을 거치지 않아 약간 빠를 수 있습니다.

  5. 언제든 static을 붙여도 괜찮을까요?

    테스트·모킹·확장성을 생각하면, 객체 상태를 쓰지 않는 순수 함수에만 제한적으로 사용하는 것이 좋습니다.


핵심 요약

  • 클래스 메소드 → 객체 독립 유틸·전역 데이터
  • 인스턴스 메소드 → 객체 상태 조작·다형성 구현

카테고리:

업데이트:

댓글남기기