이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
어디서든 편하게 공용으로 쓰는 변수를 Static으로 선언해서 사용하자. 라는 생각으로 간단하게 Static을 써왔던 분들이 많을 것 입니다. (필자도 마찬가지) 이번 편에서는 JVM과 관련지어서 Staic의 장, 단점을 알아보도록 하겠습니다. 인스턴스 변수와 클래스 변수와의 비교와도 상응하는 부분이겠죠.
Static의 장점
class Work { static int CommonWork = 0; int SeveralWork =0; boolean isHwang = false; void doWork() { CommonWork++; SeveralWork++; if(isHwang == false) { System.out.println("공통 과제"+CommonWork+"번, "+"Hwan 과제"+SeveralWork+"번 수행했습니다."); } else { System.out.println("공통 과제"+CommonWork+"번, "+"Park 과제"+SeveralWork+"번 수행했습니다."); } } } public class School { public static void main(String[] args) { Work Hwang = new Work(); Work Park = new Work(); Hwang.isHwang=false; Hwang.doWork(); Park.isHwang=true; Park.doWork(); } }
[실행결과]
Hwang과 Park 두 사람이 있습니다. 두 사람은 각각 개인 과제를 하면서 공통 과제의 내용을 참고하는 상황입니다. 실행 결과를 보면 공통과제는 2번, 개인 과제는 각 각 1번 으로 나와있습니다. 왜 이렇게 나왔을까요? 이에 대해 이해가 안 가신다면 이전 포스팅 두개에 대해 천천히 읽어보고 오시길 바랍니다. Static으로 선언된 CommonWork는 클래스가 생성되는 순간 메서드 영역에 생성되어 생성된 인스턴스 사이에 공유되지만, ServeralWork 변수 같은 경우는 각각의 인스턴스 별로 따로 관리되기 때문이죠.
1. 메모리를 효율적으로 사용할 수 있다.
생성할 때마다 인스턴스가 힙에 올라가는 것이 아니라 고정 메모리이므로 효율적입니다.
2. 속도가 빠르다.
객체를 생성하지 않고 사용하기 때문에 빠릅니다.
Staitc의 단점
1. 무분별한 Static의 사용은 메모리 릭의 원인이 된다.
클래스 변수인 Static 변수는 클래스가 생성될 때 메모리를 할당 받고 프로그램 종료 시점에 반환되므로 사용하지 않고 있어도 메모리가 할당되어 있습니다. 반면에 객체 생성으로 만들어진 인스턴스는 참조되지 않으면 Garbage Collection에 의해 소멸되므로 메모리 낭비를 방지합니다.
2. 많이 참조되는 Static 변수는 오류 발생 시 디버깅이 힘들다.
큰 프로젝트에서 값이 자주 바뀌는 객체를 Static으로 선언하게 되면 예상치 못한 오류가 생길 수 있다고 합니다.
그렇다면 Static을 어떻게 써야할까
1. 공유되는 값에 사용한다.
카드를 예로 들면, 카드 게임에 참여하는 각각의 사용자는 문양, 숫자가 달라야하지만 카드의 가로 세로는 같아야하기 때문에 Static으로 선언합니다.
또는 세트 물품의 가격은 5000원으로 공통되게 Static으로 월마다 세트 물품의 내용은 인스턴스로 월마다 바뀔 수 있도록 사용합니다.
2. 절대적으로 바뀌지 않는 값에는 final 과 함께 사용합니다.
3.14나 하루가 24시간인 것은 바뀌지 않으므로 final static으로 선언합니다.
'Basic > Java' 카테고리의 다른 글
Java Enum 기본 (0) | 2019.11.27 |
---|---|
[JAVA] Garbage Collection의 기초 (4) | 2016.07.20 |
[JAVA] 객체(Object)의 형 변환 (2) | 2016.07.19 |
[JAVA] JVM의 메모리구조 (0) | 2016.07.19 |
[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수) (6) | 2016.07.19 |
[JAVA] 절차지향언어와 객체지향언어 (0) | 2016.07.19 |