Java - Static ?
- static은 정적이라는 의미를 가지고 있는데, 변수와 메서드에 지정하여 사용할 수 있다.
- 변수에 사용할 경우 클래스 변수라고 부르는데, 우리가 알고 있는 4가지 변수인 지역변수, 매개변수, 인스턴스변수, 클래스변수 중 하나이다.
- 정적 변수와 정적 메서드는 인스턴스에 속한 멤버가 아니라, 클래스에 고정된 멤버이기 때문에 클래스 로더가 클래스를 로딩해서 JVM 클래스 영역에 적재할 때 클래스별로 관리가 된다.
- 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.
- 우리가 동적 로딩이 너무 느릴 경우를 대안해서 공통적으로 사용해도 괜찮은 변수와 메서드에는 static을 붙여 그 단점을 보완하기도 한다.
즉, 객체 생성을 하지 않고 클래스 변수나 메서드를 호출하도록 하는 제어자인 것이다.
1. Static 변수
- static으로 선언된 변수는 그 값을 공유한다.
class Count() { static int count = 0; public countUp() { this.count ++; } } public void static main(String[] args) { Count c1 = new Count(); Count c2 = new Count(); c1.countUp(); c2.countUp(); }
- 이라는 클래스가 있다.
- 이렇게 하면, count 변수가 static이기 때문에 메모리를 공유하여 c1으로 조회를 하든, c2로 조회를 하든, 2가 된다.
2. Static 메서드
- 메서드를 static으로 선언하면, 해당 클래스를 인스턴스화 하지 않아도 메서드 호출이 가능하다. 대신 인스턴스에서는 호출이 불가능하다.
- static 메서드는 오버라이딩 할 수 없다.
- static 메서드 안에서는 인스턴스 변수… 즉 클래스 내에서 static이 붙지 않은 변수는 사용할 수 없다.
public class Count() { static int count = 0; public static countUp() { this.count ++; } }
- 이렇게 메서드에 static이 붙으면
Count.countUp();
- 이렇게 인스턴스를 생성하지 않고 메서드를 사용해야 한다.
3. Static 의 장,단점
장점
- 메모리 측면에서 효율적일 수 있다. static 영역에 저장되어있는 메모리를 사용하기 때문에, heap 영역에 매번 인스턴스를 만들지 않아도 된다.
- 객체를 생성하지 않고 사용 가능하기 때문에 속도가 빠르다.
단점
- static 메모리는 GC의 대상이 아니기 때문에, static을 과하게 사용할 시 반대로 메모리에 문제가 생길 수 있다.
- 객체지향적이지 못하다.
- 왜냐하면 static에는 private를 사용할 수 없기에, 캡슐화가 되지 않기 때문이다. 그래서 데이터 은닉이 약해질 수 있다.
- 재사용성을 높여주는 자바의 객체지향 기능인 인터페이스를 이용한 설계 및 구현에 방해를 준다.
- 다중 스레드 롼경에서 안전하지 않을 수 있으며, 동기화 문제가 발생할 수 있다.
- syncronized 등 별도의 동시성 문제를 해결하는 코드를 작성해주어야 한다.
- 공유 메모리기 때문에 예측 불가능한 버그가 발생할 수 있으므로, 테스트를 확실히 해야한다.
즉, static을 사용할 때는 신중하게 고려해야되며 객체 지향 디자인 원칙을 준수 하고, 동기화 문제를 고려해야 한다.
특히, 메모리를 많이 사용할 수 있는 Collection 류의 자료구조를 static으로 선언하는데에 유의해야하며, 배치와 같이 주기적으로 사용해야하는 경우에만 static을 사용하는 것이 좋다.