[Java] static이란?

이재표·2023년 10월 28일
0

자바에서 필드 및 메서드 앞에 static 키워드를 붙혀있는것을 흔히 볼수 있다. 이를 정적필드 또는 정적 메서드라 하는데, 일반적인 인스턴스의 변수와 메서드와 달리 메모리의 static영역에 올라가기 때문에 따로 객체 생성 없이 바로 사용가능하다.

메모리 구조

  • 데이터(Data) 영역 (정적 메모리)
    - 전역 변수와 static 변수가 할당되는 영역
    - 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리에서 소멸됨
  • 스택(Stack) 영역
    - 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
    - 함수 호출이 완료되면 사라짐
  • 힙(Heap) 영역
    - 동적으로 할당된 변수
    - 사용자에 의해 직접 관리될수 있는 메모리역역

    일반적인 메서드는 Heap영역에 올라가 GC(c언어의 free를 해주는 JVM의 기능)에 의해 자동으로 관리되게 된다. 즉 사용하지 않는 객체(선언되지 않은 객체)의 경우 알아서 삭제시킴으로써 메모리를 관리해준다.

사용법

선언

staic변수
public class Constant {
    public static final String START_GAME_MENT = "숫자 야구 게임을 시작합니다.";
}
-------------------------------------
static메서드
public class Computer {
    public Computer() {
    }

    public static String createValidBaseballNum() {
        List<String> baseballNum = new ArrayList<>();
        while (baseballNum.size() < BASEBALL_NUM_LIMIT_LENGTH) {
            String invalidNum = String.valueOf(Randoms.pickNumberInRange(1, 9));
            if (Validator.validNumNotInList(invalidNum, baseballNum)) {
                continue;
            }
            baseballNum.add(invalidNum);
        }
        return String.join("", baseballNum);
    }
}

사용

 public void startGame() {
        String baseballNum = Computer.createValidBaseballNum();
        playGame(baseballNum);
    }

주의점

  • 메서드 안에 인스턴스 변수가 존재하면 안된다.
    -> 애플리케이션 실행과 함께 메모리에 올라가야하므로 힙 영역에 있는 인스턴스 변수가 메서드에 들어가면 안된다.

그렇다면??

그냥 다 static으로 선언하는면 생성하지 않고 너무 편하지 않을까?

NO!

  • GC에서 자동으로 메모리를 관리해주는것이 아닌 메모리에 바로 올라가 존재하기 때문에 너무 많은 static의 경우 메모리에 부하를 주기 때문에 과도한 static선언은 지양해야합니다.
  • 전역적으로 접근할수 있는 단순한 유틸리티성 메서드만 가지고 있는 구조이기 때문에 외부에서 접근할수 없다는 객체지향 원칙에 벗어나게 된다.
  • 오버라이드 될수 없기 때문에 재사용성이 떨어지게 된다.

0개의 댓글