Posts [우아한테크코스] 싱글톤 패턴은 객체지향적일까? (Is the singleton pattern object-oriented?)
Post
Cancel

[우아한테크코스] 싱글톤 패턴은 객체지향적일까? (Is the singleton pattern object-oriented?)

Introduction

어제 오전, 우테코 슬랙에 루트가 아래와 같은 질문을 남겼다.

root_question

이 스레드의 답변들을 읽다가 마침 같이 모각코를 하고 있던 크루들에게 생각을 물어봤다.

처음에 손너잘은 객체지향적이라는 의견이었고, 검프와 나봄은 객체지향적이 아니라는 의견이었다.
나중에 손너잘도 나봄이랑 얘기한 후에 객체지향적이 아니라는 의견으로 변경하긴 했지만..
아무튼 크루들의 의견을 바탕으로 이해한 내용을 정리하려고 한다!

Opinion: It is object-oriented

  • 유틸리티 클래스는 객체 생성이 불가능한 반면, 싱글톤 패턴은 1개의 객체 생성이 가능하다.
  • 객체는 협력이 중요하다.
  • 유틸리티 클래스는 객체와 협력하지 않는다.
  • 어느 클래스든지 혼자 비집고 들어가서 의존성을 생성하고 할 일을 수행한다. 👉 이는 협력이 아니다.
  • 그래서 순수 객체지향론자들은 static을 아예 사용하면 안 된다고 말하는 것이다.
  • 그렇지만, 싱글톤 패턴을 사용한다고 해서 다른 객체들과 협력을 하지 않고 자기 혼자 의존성을 생성하고 할 일을 하는 걸까? 아니라고 생각한다.
  • 싱글톤 패턴을 사용해도 결국 객체는 다른 객체와의 협력을 통해 약한/강한 결합을 하고, 메시지를 주고 받으면서 책임을 수행한다.
  • 이런 관점에서 싱글톤 패턴을 사용하는 것이 객체지향을 위반한다고 생각하지 않는다.

Opinion: It is not object-oriented

  • 싱글톤 패턴이 상태를 가져도 될까? 라는 질문에서 시작한다.
  • 싱글톤 패턴을 사용하면 객체를 계속 생성해도 똑같은 주소를 참조한다. 👉 이는 멀티 쓰레드 환경에서 매우 위험하다.
  • 따라서, 멀티 쓰레드 환경에서 싱글톤 패턴 형식의 객체는 상태를 갖는 걸 지양하는 게 맞다.
    • 만약, 싱글톤 패턴이 상태를 가져도 멀티 쓰레드 환경에서는 side-effect 때문에 함부로 상태를 변경할 수 없다.
    • 이렇다면, OOP에서 중요한 객체의 자율성이 없다고 생각한다.
  • 그러면 상태가 없는 객체가 객체지향적일까?
  • 상태가 없는 객체 == 식별자가 없는 객체 👉 객체를 너는 무엇이다라고 식별할 게 없다는 뜻이다.
  • 포비 수업에서 배운 것처럼 객체를 무엇이라 바라보는 것이 아니고, 무엇을 하는 존재로 만드는 것이다. 👉 이는 유틸리티 클래스가 된다.
    • 『엘레강트 오브젝트』에서는 유틸리티 클래스의 메소드는 선언형 방식이 아닌 명령형 방식이기 때문에 OOP에서 바라봤을 때 anti-pattern이다.
    • 따라서, 싱글톤 패턴을 객체지향적이라 생각하기 힘들다.
  • 그렇지만, 클래스를 설계하는 입장에서 side-effect를 걱정할 일이 없어 일반적인 상태를 갖는 객체처럼 사용하면 객체지향적일 수도 있다.
    • 하지만, 싱글톤 패턴으로 생성할 때 유연하게 의존성을 주입할 수 없다는 단점이 있다.
  • 그런데, 웹 개발에서는 멀티 쓰레드 환경도 고민해야 한다.
  • 따라서, 이런 관점에서 싱글톤 패턴을 사용하는 건 객체지향을 위반한다고 생각한다.

Reference

  • 우아한테크코스 슬랙 - 루트 질문 on Mar 19
This post is licensed under CC BY 4.0 by the author.

[Java] flatMap으로 중첩 루프 없애는 방법 (How to remove nested loops using flatMap)

[우아한테크코스] SQL 퀴즈 및 정답 (SQL Quizzes and Answers)