static 이란?
static 키워드는 메서드, 블록, 내부 클래스에 적용될 수 있습니다.
멤버에 적용하는 경우 클래스 레벨에 속하는 클래스 변수가 됩니다. 해당 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있지만, 인스턴스가 모두 해당 변수를 공유합니다.
static 키워드가 붙으면 클래스가 로딩될때 메모리에 할당되며, 프로그램 종료시까지 유지됩니다. 즉, 인스턴스마다 별도의 메모리 공간을 차지 하지 않습니다. (명시적으로 null 설정 시 GC 대상은 됩니다.)
장점
- 모든 인스턴스가 공유하므로 공통된 데이터를 관리할 수 있습니다.
- 클래스 레벨에서 하나만 존재하므로 여러 인스턴스가 생성되더라도 메모리를 더 효율적으로 사용 가능합니다.
- 인스턴스를 만들지 않아도, 클래스 이름으로 접근이 가능하기 때문에 전역 데이터 관리 및 공통 로직을 수행 할 수 있습니다.
단점
- static은 클래스와 긴밀하게 결합되므로 테스트가 어려워질 수 있습니다.
- static 멤버를 남용하면 상태가 공유되어 예기치 않은 상황이 발생할 수도 있고, 동기화 문제도 발생할 수 있습니다.
- 객체지향적인 설계 원칙을 위반할 수 있습니다. 객체 간의 의존성이 증가하거나 클래스 확장이 어려울 수 있습니다.
왜 static 은 객체지향 적이지 않을까?
- 객체의 상태와 행동의 분리가 어렵다.즉, 외부 값에 의존하는 수동적인 객체가 됩니다.
- 객체지향 프로그래밍의 핵심은 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위로 묶어 객체를 만드는 것입니다. static 멤버는 클래스 수준에서 관리되므로 객체의 상태와 행동을 분리하기가 어려워집니다.
- 상속과 다형성 문제자식 클래스에서 static 메서드를 재정의할 수 없습니다.
- static 멤버는 클래스 레벨에서 존재하므로 상속과 다형성을 어렵게 만듭니다.
- 캡슐화 위반
- 클래스 외부에서 직접 접근할 수 있으므로 캡슐화 원칙을 위반합니다.
- 단위 테스트 어려움
- static 멤버는 클래스와 긴밀하게 결합되므로 모의 객체(Mocking) 사용이 어려워지고, 테스트 작성과 유지보수가 어려워집니다.
- 메모리 낭비
- static 멤버는 프로그램이 실행될 때 부터 메모리에 할당되며 명시적으로 null 선언하지 않을 시 프로그램이 종료될 때 까지 유지되므로, 남용하면 불필요한 메모리 낭비가 발생할 수 있습니다.
- 다중 스레드 환경에서의 문제
- static 멤버는 여러 스레드에서 공유될 수 있어 동시성 문제가 발생할 수 있습니다.
그럼 static을 언제 사용하면 좋을까?
- 상수 정의 : 절대 변하지 않는 수는 상수인데, 해당 상수는 객체 내에서 일반변수로 정의하기 보단, 정적 변수로 정의하면 메모리를 아낄 수 있다.
- 유틸리티 클래스 정의 : 인스턴스 메서드와, 인스턴스 변수를 제공하지 않고, 데이터 처리를 위한 정적 메서드만 존재하는 클래스이다. Java에서 Math가 대표적인 예시이다. 즉, 인스턴스를 생성해 객체의 상태를 이용할 생각이 없을 때, 공통 로직이 필요할 땐 static을 이용하여 설계한다.
'Back-end' 카테고리의 다른 글
정적 vs 동적 in Java (0) | 2023.08.18 |
---|---|
클래스 로더 (0) | 2023.08.18 |
Hash, HashTable, HashMap, CuncurrentHashMap (0) | 2023.08.16 |
ArrayList vs LinkedList vs Array (0) | 2023.08.16 |
hashCode() (0) | 2023.08.16 |