[JAVA]Static 잘 사용하기

euuuunii·2023년 3월 7일
0

java궁금증

목록 보기
3/3

static의 특징

1. Garbage Collector(GC)의 대상이 되지 않는다. Class 영역에 저장된다.

2. static 멤버는 사용을 하던 사용하지 않던 프로그램의 시작과 끝까지 메모리 내에 존재한다.

프로그램이 로딩될 때 생성되고, 프로그램이 종료되거나 JVM이 내려갈 때 소멸된다.

3. static 변수는 '객체의 변수'가 아닌 '클래스의 변수'가 된다.

해당 클래스의 모든 객체가 동일한 주소값을 참조한다.

static은 잘 사용하면 성능을 향상시킬 수 있지만, 잘못 사용하면 독이된다.
특히 여러사람이 사용하는 환경에서는 조심해야한다.


static 으로 성능 향상시키기

1. 자주 사용하고 절대 변하지 않는 상수 : final static

GC대상객체가 사라지게 되는것이므로 이득

2. 각 객체들에서 공통적으로 하나의 값이 유지되어야 할 경우

3. 설정 파일 정보

클래스 객체를 생성할때마다 설정 파일을 로딩하면 성능저하가 발생하기 때문에 static으로 관리하는것이 좋다.

4. 코드성 데이터

코드성 데이터 : 규칙을 넣어 약속한 것으로 암호 = 코드 식으로 숫자로 처리한 데이터

건수가 그리 많지 않되 조회빈도가 높은 코드성 데이터는 DB에서 한번만 읽어서 관리하는 것이 성능 측면에서 좋다.

5. 공통으로 사용해야하는 반복적인 메서드

메서드는 실행시 Heap영역에 생성하고, 사용이 끝나면 메모리를 해제해야한다. 이 동작을 10,000번 하게 되면 GC에 오버헤드가 발생한다.
static키워드를 사용하면 Heap영역에 생성 및 해제를 할 필요가 없어진다.


static 사용시 주의할 점

1. 메모리 효율이 떨어질 수 있다.

정적 메소드는 객체를 생성하지 않고 사용한다. 반복적으로 객체를 생성하지 않아도 되니 메모리 효율에 좋을 것 같다는 생각이 들 수도 있다.
하지만 static 키워드가 붙은 메소드 등은 GC의 대상이 아니다. 따라서 static으로 할당된 영역이 크다면 GC의 효율이 떨어진다.

static영역이 지나치게 많은 메모리를 차지하고 있다면, 메모리 부족 현상이 발생할 수 있다.

Memory Leak

  • 더이상 사용하지 않는 객체가 GC에 의해서 회수되지 않고 계속 누적되는 현상.
  • Static을 사용하게 되면 GC가 메모리 해제를 하지 못해 메모리 부족현상이 발생

2. Collection 객체

어떤 클래스에 데이터를 Vector나 ArrayList에 담을 때 해당 Collection 객체를 static으로 선언하면 어떻게 될까? 만약 지속적으로 해당 객체에 데이터가 쌓인다면, 더이상 GC가 되지 않으면서 시스템은 OutOfMemoryError를 발생시킨다.

2. Thread-safe하지 않다.

여러 쓰레드에서 하나의 변수에 접근할 수 있기 때문에 데이터가 꼬이는 큰 일이 발생할 수도 있다. 이를 보장하기 위해서는 synchronize를 사용해야한다.

3. 객체 지향적이지 않다

static은 객체 지향 보다는 절차 지향에 가까운 키워드이다.
static 메소드는 객체지향의 다형성과 message passing을 위반한다.

  • Overriding와 Dynamic Binding이 불가능.
  • message passing : 각 클래스를 구현 할 때 클래스 내부에서 선언된 변수는 클래스 내부의 메서드를 통해서만 핸들링되게 하는 원칙.


결론

static을 사용하였을때 얻는 장점도있고, 단점도 있다.
static을 사용하느냐 안하느냐의 판단은 결국 개발자의 몫이다.

배운 점

Collection 객체는 static으로 선언하지 말자!!!




참고 출처

https://12bme.tistory.com/94
https://tecoble.techcourse.co.kr/post/2020-07-16-static-method/

profile
안녕하세요😊 개발 도중 생기는 궁금증을 탐구하는 블로그 입니다

0개의 댓글