Static (정적)
- Static(정적)은 '고정된'이란 의미
- Static 키워드를 사용해 만들어진 변수와 메서드를 각각 정적변수(정적 필드), 정적 메서드라 부름
- 이 둘을 합쳐 정적 멤버 또는 클래스 멤버라고 함
- 클래스 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버
- 클래스 로더가 클래스를 로딩해서 메모리 영역에 적재할 때 클래스별로 관리
- 따라서 클래스의 로딩이 끝나는 즉시 사용할 수 있음 (생성자를 이용해 클래스를 따로 메모리에 적재하지 않아도 됨)
- 항상 메모리에 적재되어 있으므로 GC(Carbage Collector)가 관리하지 않음
📌 Static 메모리 구조

📌 Static 사용시 장점
- Static을 사용한 클래스 멤버는 메모리 할당을 딱 한 번만 하기 때문에 메모리 사용을 효율적으로 할 수 있음
- Static을 사용한 클래스 멤버는 모두 같은 메모리 주소를 공유함
- 따라서 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 사용
🚨 사용시 주의할 점
- 과도한 사용시 메모리 낭비가 발생해 시스템 퍼포먼스에 악영향을 줌
- OOP 원칙 중 하나인 캡슐화에 어긋남
- 모두 공유하는 글로벌 변수 성격을 띄고 있어 SideEffect발생 가능성
- 오버라이딩 할 수 없으므로 코드의 재사용성이 떨어짐
- 정적 메서드에서는 인스턴스 변수를 사용할 수 없음
- 정적 메서드는 인스턴스 생성 없이 호출 가능한 반면 인스턴스 변수는 인스턴스를 생성해야만 사용 가능
- 정적 메서드를 호출했을 때 인스턴스 변수가 생성되어 있지 않을 수 있음
- 따라서 정적 메서드 작성 시 인스턴스 변수를 사용하면 안됨
📌 Static을 사용하면 좋은 경우
- 자주 사용하는 객체 + 만드는데 오래 걸리고 메모리를 많이 사용하는 객체
💡 코드로 보는 예시
public class MyMethod {
static void myStaticMethod() {
System.out.println("static method는 인스턴스의 생성 없이 바로 사용 가능");
}
public void myPublicMethod() {
System.out.println("static method가 아니라면 인스턴스 생성 후 메모리에 적재되면 사용 가능");
}
public static void main(String[] args) {
myStaticMethod();
MyMethod myObj = new MyMethod();
myObj.myPublicMethod();
}
}