클래스 멤버로만 이루어진 추상 클래스?

클래스 멤버로만 이루어진 추상 클래스?

어떤 이점을 얻기 위해 이런 구조를 채택했을까?


StringUtils


심심해서 스프링 코드 분석을 하다가 스프링 코어에서 제공하는 StringUtils가 특이한 구조로 설계돼있음을 알았다.

StringUtils는 추상 클래스인데 모든 멤버가 클래스 멤버(static)로 이루어져 있었다.


클래스


메서드


특히 작성자란에 스프링의 아버지인 로드 존슨형님이 계셨기 때문에 분명히 어떤 고의적인 의도를 갖고 채택된 구조라는 생각이 들었다.

즉시 호기심이 머리를 치켜들었다.

이런 구조를 가져감으로서 얻을 수 있는 이점으로 대체 무엇이 있을까?


우선 든 생각은 이랬다.


  1. StringUtils는 유틸성 클래스이다.
  2. 추상 클래스는 자체적으로 인스턴스를 생성할 수 없다.
  3. 1과 2를 조합해 일종의 싱글톤 패턴과 비슷한 효과를 노린게 아닐까? (==메모리 절약)


그래서 생성자를 보니 의외로 기본 생성자가 public으로 명시되어 작성돼있었다.

이게 무슨 의미냐면, 자바 컴파일러는 생성자를 작성하지 않을 경우 기본 생성자를 알아서 생성해준다.

그럼에도 불구하고 기본 생성자가 굳이 public 이라는 접근 제한자로 작성돼있다는 것은 클래스 설계자들이 기본 생성자를 고의적으로 열어두었다는 의미와 같다.

즉, 클래스 설계자들은 이 클래스가 확장될수도 있다고 예상했음이다.

또한, 싱글톤 패턴의 효과를 노렸다면 차라리 싱글톤 패턴을 적용하고 말지, 이런 구조로 작성할 이유가 없다.

따라서 내 생각은 클래스 설계자들의 의도에서 벗어난다.


그럼 클래스 설계자들은 어떤 의도로 이 클래스를 이렇게 만들었을까?

주변에 조언을 구하니 정말 다양한 의견을 얻을 수 있었다.

최종적으로 정리한 내용은 하기와 같으며, 내가 생각하기에 아래에 정리된 내용이 클래스 설계자들의 의도에 가장 근접했다고 생각한다.


  • 생성자가 오픈된 추상 클래스이기 때문에 구현상속할 수 있고, 이 경우 메서드 시그니처의 하위호환성도 함께 보장해줄 수 있다
    • 하지만 StringUtils같은 완성형 유틸 클래스가 확장되야만 하는 경우가 존재할까?
    • 이 세상에 평생동안 요구사항이 변하지 않는 코드는 존재하지 않는다. 즉, 클래스 설계자들은 미래에 이 클래스에 추가적인 기능이 필요해 결국 확장될 수 있다고 생각했을 가능성이 충분히 존재한다
  • 추가적인 기능이 필요하지 않아 그대로 사용 할 경우 인스턴스 생성을 못하게 강제할 수 있기 때문에 메모리 절감 효과를 충분히 누릴 수 있으면서도 언제든지 확장될 수 있는 클래스이다.


아무튼 구루들이 개발한 프로그램들은 뭐 하나 허투루 작성된게 없는 것 같다.



© 2022. All rights reserved.