❓정적 메서드는 언제 사용할까
- static 키워드에 대해 공부를 하다보니, static method를 언제 사용을 할까에 대해 의문이 들었다.
- 보통 유틸 관련 메서드에서 많이 사용한다. 라고 들었지만, 유틸 관련 메서드가 아닌 다른 곳에서 쓰일 일이 있을까? 라는 의문점도 같이 찾아왔다.
✅ static 메서드의 특징 및 장점
- static으로 선언되어 있는 메서드 들은 해당 메서드를 사용할 때, 인스턴스 생성 없이 호출이 가능하다.
- JVM이 시작될 때 static 영역에 저장되어 프로그램이 끝날 때 까지 사라지지 않고 메모리에 남아있다.
- 속도가 빨라지고 공유(반복적인 사용)에 효율적이다.
- 생성자를 호출 할 필요가 없으니 속도는 당연 빨라질 수밖에 없다.
- static 메서드를 호출하기 위해서 필요한 것은 단지 클래스 이름과 메서드 이름 뿐 이다.
✅ static 메서드의 단점
- 객체 지향에서 멀어지고 메모리 효율이 떨어질 수 있다.
- static 키워드는 객체 지향 보다는 절차 지향에 가까운 키워드이다.
- 정적 메서드는 객체의 생성, 제거와 관계없이 프로그램 시작부터 끝까지 메모리에 남아있기 때문이다.
- (1) Message Passing (메시지 전달) 위반
- 정적 메서드는 객체의 생성 주기와는 관계가 없다.
- 객체 지향에서, 객체들은 서로 관계를 맺고 메시지를 통해 정보를 교환하고 결과를 반환한다.
- 정적 메서드를 실행하는 것은 객체에게 행위를 지시하는 것이 아니고, 다른 객체와 관계를 맺고 있지도 않다.
- 즉, 메시지 전달이 아니라 (절차 지향의) 함수 호출에 불과하다고 할 수 있다.
- static 키워드는 객체 지향 보다는 절차 지향에 가까운 키워드이다.
- 오버라이딩과 (2) 동적 바인딩 (Overriding & Dynamic Binding)
- 정적 메서드는 메소드 재정의와 동적 바인딩이 불가능하다.
- 그 이유는, 정적 메서드는 런타임 이전 컴파일 시에 정적 바인딩이 이루어지기 때문이다.
- 정적 메서드는 메소드 재정의와 동적 바인딩이 불가능하다.
- 메모리 효율 저하
- 정적 메소드는 객체를 생성하지 않고 사용하기 때문에 메모리 효율에 좋다고 생각할 수도 있을 것 같다.
- 하지만 런타임 중 동적으로 생성된 것들 (클래스의 인스턴스)은 (3) GC의 대상이 되는 반면, static 키워드가 붙은 메서드 등은 GC의 대상이 아니다.
- static으로 할당된 영역이 크다면 GC의 효율이 떨어지기 마련이며, 프로그램이 끝날 때 까지 그 영역은 메모리에서 내릴 수 없다.
- 즉, static 영역이 지나치게 많은 메모리를 차지하고 있다면 메모리 부족 현상이 발생할 수 있다.
📌 static 메서드를 사용? 사용 자제?
한 문장으로 정의하면 인스턴스를 생성하지 않고 호출 할 것인가? -> 그렇다! 면 정적이라고 보면 된다.
- 인스턴스 생성에 의존하지 않는다.
- 메소드가 인스턴스 변수를 사용하지 않는다.
- 메소드가 변화되지 않고, 오버라이딩 되지 않는다.
- 메소드가 공유되고 있다.
면, 정적 메소드 사용을 고민해보자.
📒 용어 사전
(1) Message Passing (메시지 전달)
- 한 객체에서 다른 객체로 데이터를 전달 하거나, 다른 객체의 메소드를 실행시키는 것을 의미
(2) 동적 바인딩
- 후기 바인딩, 동적 바인딩 또는 동적 연결은 객체에 대해 호출되는 메소드 또는 인수와 함께 호출되는 함수를 런타임에 이름 별로 찾는 컴퓨터 프로그래밍 메커니즘을 의미
(3) GC (Garbage Collection)
- 프로그래머가 동적으로 할당한 메로리 영역 중 더 이상 쓰이지 않는 영역을 자동으로 찾아내어 해제하는 기능
'배움 기록_실무 ✏️' 카테고리의 다른 글
서버리스 아키텍처 적용기 - 서버리스란 무엇일까 ? (0) | 2023.03.30 |
---|---|
AWS Simple Queue Service (SQS) (0) | 2023.02.23 |
static의 모든 것 (0) | 2022.10.10 |
AWS Database Migration Workshop (1) | 2022.05.25 |
구글 OAuth2 인증 방식 (0) | 2022.03.29 |