본문 바로가기
Back-end

static

by 신재권 2023. 8. 16.

static 이란?

static 키워드는 메서드, 블록, 내부 클래스에 적용될 수 있습니다.

멤버에 적용하는 경우 클래스 레벨에 속하는 클래스 변수가 됩니다. 해당 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있지만, 인스턴스가 모두 해당 변수를 공유합니다.

static 키워드가 붙으면 클래스가 로딩될때 메모리에 할당되며, 프로그램 종료시까지 유지됩니다. 즉, 인스턴스마다 별도의 메모리 공간을 차지 하지 않습니다. (명시적으로 null 설정 시 GC 대상은 됩니다.)

장점

  • 모든 인스턴스가 공유하므로 공통된 데이터를 관리할 수 있습니다.
  • 클래스 레벨에서 하나만 존재하므로 여러 인스턴스가 생성되더라도 메모리를 더 효율적으로 사용 가능합니다.
  • 인스턴스를 만들지 않아도, 클래스 이름으로 접근이 가능하기 때문에 전역 데이터 관리 및 공통 로직을 수행 할 수 있습니다.

단점

  • static은 클래스와 긴밀하게 결합되므로 테스트가 어려워질 수 있습니다.
  • static 멤버를 남용하면 상태가 공유되어 예기치 않은 상황이 발생할 수도 있고, 동기화 문제도 발생할 수 있습니다.
  • 객체지향적인 설계 원칙을 위반할 수 있습니다. 객체 간의 의존성이 증가하거나 클래스 확장이 어려울 수 있습니다.

왜 static 은 객체지향 적이지 않을까?

  1. 객체의 상태와 행동의 분리가 어렵다.즉, 외부 값에 의존하는 수동적인 객체가 됩니다.
  2. 객체지향 프로그래밍의 핵심은 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위로 묶어 객체를 만드는 것입니다. static 멤버는 클래스 수준에서 관리되므로 객체의 상태와 행동을 분리하기가 어려워집니다.
  3. 상속과 다형성 문제자식 클래스에서 static 메서드를 재정의할 수 없습니다.
  4. static 멤버는 클래스 레벨에서 존재하므로 상속과 다형성을 어렵게 만듭니다.
  5. 캡슐화 위반
  6. 클래스 외부에서 직접 접근할 수 있으므로 캡슐화 원칙을 위반합니다.
  7. 단위 테스트 어려움
  8. static 멤버는 클래스와 긴밀하게 결합되므로 모의 객체(Mocking) 사용이 어려워지고, 테스트 작성과 유지보수가 어려워집니다.
  9. 메모리 낭비
  10. static 멤버는 프로그램이 실행될 때 부터 메모리에 할당되며 명시적으로 null 선언하지 않을 시 프로그램이 종료될 때 까지 유지되므로, 남용하면 불필요한 메모리 낭비가 발생할 수 있습니다.
  11. 다중 스레드 환경에서의 문제
  12. static 멤버는 여러 스레드에서 공유될 수 있어 동시성 문제가 발생할 수 있습니다.

그럼 static을 언제 사용하면 좋을까?

  1. 상수 정의 : 절대 변하지 않는 수는 상수인데, 해당 상수는 객체 내에서 일반변수로 정의하기 보단, 정적 변수로 정의하면 메모리를 아낄 수 있다.
  2. 유틸리티 클래스 정의 : 인스턴스 메서드와, 인스턴스 변수를 제공하지 않고, 데이터 처리를 위한 정적 메서드만 존재하는 클래스이다. 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