코딩을 하면서 한 번쯤은 Static이 뭐지?라고 생각해 보신 적이 있으실 겁니다. 언제 사용해야 하는 것이며, 언제는 사용하면 안 되는지 알아보기 위해서 자료를 정리해 보았습니다.
From. Java의 정석 3rd Edition By 남궁 성 (344p)
Static은 '클래스의' 또는 '공통적인' 의미를 가지고 있다. 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, static 변수는 인스턴스에 관계없이 같은 값을 갖는다.
Static이 사용될 수 있는 곳은 - 클래스의 변수, 메서드, 초기화 블럭이다.
Static이 사용된 메서드들은 인스턴스를 생성하지 않고도 호출이 가능하게 된다. 이때 static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
Static 키워드를 이해하기 위해서는 JAVA에 꼭 필요한 JVM의 메모리 구조 및 실행 단계에 대한 이해가 필요합니다.
코드를 작성한다면 확장자가 java인 *.java 파일들이 만들어집니다. 해당 java 파일들은 Java 컴파일러(javac)에 의해 .class파일인 JAVA Byte Code로 컴파일됩니다. 이렇게 컴파일된 바이트 코드들은 Class Loader가 메모리가 할당된 Runtime Data Area으로 코드들을 적재시킵니다.
Heap Area은 메서드 안에서 사용되는 객체들을 위한 영역으로 new를 통해 생성된 객체, 배열, immutal 객체 등의 메모리와 값이 저장됩니다.
Method Area(Static Area)는 static으로 지정된 메서드 멤버 값들이 저장됩니다.
장점이 많은 static임에도 불구하고 객체지향 프로그래밍에서는 static을 지양해야 한다는 이야기가 나온다. 그 이유는 무엇일까?
1. 객체와 다른 라이프사이클
2. 메모리 문제
3. 코드의 상호의존성(inter-dependency)이 높다
4. static 메서드는 오버라이딩 불가
5. 테스트 어려움
자료를 찾아보았지만 결과를 얻지 못한 기분입니다. 정답이 주어진 것이 아니고 상황에 따라서 다르지만, 대부분의 객체지향적인 코드를 지향한다면 피하라는 의미라고 생각된다. 그렇다고 static을 사용을 금기시하는 것은 아니다. 분명 메모리 적으로 인스턴스 변수를 사용했을 때와 메서드를 활용할 때 트레이드 오프를 잘 계산해야 할 것이다. 우선은 캡슐화를 목표로 하기 위해서 대안으로 final를 사용하는 것으로 하고 더 깊은 공부가 필요해 보인다.
Java의 정석 3rd Edition By 남궁 성 (344p)