About ' Static '

SUUUI·2025년 3월 27일

java

목록 보기
4/16

정적(static)"이라는 키워드가 붙은 변수, 메서드, 초기화 블록은 클래스에 속하는 개념이다 .

  • 하나의 클래스당 하나만 존재 할 수 있으며 클래스 외부에서 호출하여 사용할때 생성자 호출을 하지 않아도 사용할 수 있다는 점이 다르다.

  • JVM 이 클래스를 로드할 때 메모리가 할당되고, 프로그램이 종료될 때까지 유지된다 (static 의 생명주기)

일반 메서드 vs 정적 메서드

일반 메서드 (인스턴스 메서드)

  • 객체에 속한다
  • 객체를 생성한 후에만 호출할 수 있다 : 객체이름.메서드()
  • 인스턴스 변수와 메서드에 직접 접근 가능
  • this 키워드 사용
java
복사
Counter c1 = new Counter();  // 객체 생성
c1.printCounts();            // 객체를 통해 메서드 호출

정적 메서드 (static 메서드)

  • 클래스에 속함 (클래스 자체에 메서드가 존재)
  • 객체 생성 없이 클래스 이름으로 직접 호출할 수 있다: 클래스이름.메서드()
  • 인스턴스 변수나 메서드에 직접 접근할 수 없다 (정적 멤버만 직접 접근 가능)
  • this 키워드를 사용할 수 없다 .
Counter.printTotalCount();  // 객체 생성 없이 클래스 이름으로 직접 호출

😳그렇다면 왜 우리가 흔히 api 를 설계하기 위한 로직을 짤때 static 이 거의 안보일까??

  1. @RequiredArgsConstructor 의존성 주입 패턴을 주로 사용한다

    • Spring 같은 프레임워크는 의존성 주입을 통해 객체 간의 결합도를 낮추는데,

      static 메서드는 이런 의존성 주입 패턴과 맞지 않는다 .

  2. 객체 지향 프로그래밍의 특성

  • 서비스 레이어는 주로 상태(state)와 동작(behavior)이 함께 캡슐화된 객체로 설계됨
  • 이런 서비스들은 인터페이스를 통해 구현되는 경우가 많은데(implements UserService), 인터페이스는 정적 메서드를 가질 수 없음 (Java 8 이전).
  1. 상태 관리와 스레드 안전성
  • 웹 애플리케이션은 여러 사용자 요청을 동시에 처리하지만 정적 변수는 모든 스레드에서 공유 되므로 동시성 문제가 발생할 수 있음
  • 객체 인스턴스를 사용하면 각 요청마다 별도의 인스턴스를 생성하여 동시성 문제를 줄일 수 있음

😳그럼 static 메서드는 어디에 주로 사용될까?

  1. 객체 생성을 해주는 팩토리 메서드 ex) List.of()Entity.from()
  2. 상수 정의 ex) public static final String API_VERSION = "v1"
  3. 유틸리티 클래스의 헬퍼 메서드 ex) JWTUtil 클래스의 토큰을 생성해주는 메서드
profile
간단한 개발 기록

0개의 댓글