[Java] 정적 (Static)
정적 (Static)
자바에서 static은 '클래스의' 또는 '공통적인' 이란 의미를 가지며 static 키워드를 통해 정적 변수와 정적 메소드를 정의할 수 있다.
정적 변수
- 한 클래스에서 공통적인 값을 유지해야 할 때 선언한다.
- 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때 까지 유지된다.
- 객체 생성 없이 변수명으로 호출이 가능하다.
public class StaticTest {
public static final String DESCRIPTION = "static 변수";
}
정적 메소드
- 인스턴스 변수를 사용할 수 없으므로 인스턴스와 관계없는 메소드를 정적 메소드라 한다.
- 객체 생성 없이 메소드명으로 호출이 가능하다.
public class StaticTest {
public static long add(long a, long b) {return a + b;}
public static long divide(long a, long b) {return a / b;}
}
Static의 장점
- JVM의 Static 영역에 저장되어 고정된 메모리 영역을 사용하기 때문에 매번 인스턴스를 생성하며 낭비되는 메모리를 줄일 수 있다.
- 객체를 생성하지 않고 사용가능 하기 때문에 속도가 빠르다는 것이다. 클래스가 메모리에 올라가는 시점에 생성되어 바로 사용이 가능하기에 속도면에서 이점을 가진다.
Static의 단점
- GC의 관리를 받는 Heap 영역이 아닌 Static 영역에 프로그램 종료시까지 메모리에 할당된 채로 존재하므로 프로그램 성능에 악영향을 준다.
- Static은 따로 객체를 생성하지 않고 Static 영역에서 데이터를 불러오므로 객체의 데이터들이 캡슐화 되어야 한다는 객체지향 프로그래밍 원칙을 위반한다.
- Static 메서드는 Interface를 구현하는데 사용할 수 없다. Static 메서드는 코드의 재사용성을 높여주는 자바의 유용한 객체지향적 기능(Interface 등)을 사용하는 것을 방해한다.