About java static
프로그램이 시작되는 시점에 클래스 로더가 클래스를 해서갛여 메소드 영역 혹은 힙 영역에 클래스 메타 데이터 및 정적 변수 등을 적재.
static 저장 위치
java8 이전에는 메소드 영역인 Permanent 영역, Java8 이후에는 힙 영역에 저장
static을 사용하는 경우
- 상수 정의
- 유틸리티 클래스 정의
static을 지양해야하는 이유
- 메모리 문제 : 프로그램 실행 시점에 메모리에 할당, 대부분 종료 시점까지 메모리에서 해제되지 않는다.
- 동시성 이슈 문제 : 전역 접근이 가능
- 런타임 다형성 불가 : 객체, 메소드로 바로 접근하여 호출
- 객체의 상태를 이용 불가 : 필요로 하는 인자를 외부에서 주입해야 한다. 정적 메소드 안에는 클래스의 인스턴스 필드를 사용할 수 없다. 정적 메소드 안에서는 정적 변수만 사용.
- 테스트하기 어려움
출처