[로또 미션] 회고 : 수동적인 객체

2025. 2. 19. 23:17우아한테크코스

수동적인 객체는 항상 잘못된 것인가?

 

로또 시스템을 설계하는 과정에서 로또 객체는 스스로 당첨 여부를 판단해야 하는가? 라는 고민을 하게 되었다.

 

처음에는 현실 세계의 로또 티켓을 떠올렸고, 로또 티켓은 단순히 1 ~ 45의 숫자가 적힌 종이일 뿐이라고 생각했다.

 

현실에서는 당첨 여부를 판별하는 시스템이 따로 존재하므로, 로또 객체는 숫자만을 가지고, 당첨 여부 판단은 별도의 객체가 수행하는 것이 더 적절하다고 판단했다.

 

로또 객체는 숫자들을 저장하는 역할, 당첨 확인 객체는 당첨 여부를 판별하는 역할을 수행하게 되니 객체 간의 책임이 명확해지고, 유지보수가 쉬워지는 장점이 있다고 생각했다.

 

이 설계에 대해 크루와 논의하는 과정에서 이대로는 로또 객체가 너무 수동적인 존재가 되는 것이 아닌가? 라는 피드백을 받았다.

 

크루의 의견은 로또 객체가 스스로 당첨 여부를 판단할 수 있어야 객체지향적인 설계가 된다는 것이었다.

 

내 설계대로라면, 로또 객체가 단순히 데이터를 보관하는 역할만 수행하고, 당첨 여부를 판단하는 기능은 외부 객체에서 로또의 번호를 getter를 통해 가져와 비교하는 방식이 된다.

 

이는 로또 객체가 자율성을 잃고, 단순한 데이터 저장소 역할만 하게 된다는 문제점이 생긴다는 것이다.

 

로또가 스스로 당첨 여부를 판단해야 한다니, 어색했다.

 

비슷한 예제를 찾던 중, 출석 미션 발견.

 

출석을 관리하는 시스템을 설계한다면, 출석 데이터 객체는 단순히 출석 시간만을 저장하는 것이 아니라, 지각과 결석 같은 상태를 스스로 판단하는 기능을 포함할 가능성이 높다. (물론 별도의 클래스 메서드를 통해 계산할 수도 있지만, 출석 데이터 객체가 이를 직접 호출하여 판단하게 될 것이다.)

 

출석 데이터 객체가 출석 상태를 판별할 수 있는 메서드를 포함하는 것이 전혀 어색하다는 생각이 들지 않았다.

출석이라는 개념이 현실 세계에서 물리적인 형태가 없기에, 나의 해석이 개입되어 자연스럽게 유연한 사고가 가능했던 것은 아닐까?

 

그렇다면 로또 객체도 단순히 데이터를 저장하는 것이 아니라, 자율적으로 자신의 당첨 여부를 판단하는 것이 자연스러운 것이 아닐까?

크루의 피드백이 이해되기 시작했다.

 

해결해야 하는 문제를 현실 세계 그대로 반영할 수 있다면 로또와 같은 수동적인 객체가 자연스럽게 등장할 수 있다. 하지만 현실 세계를 그대로 반영하는 것은 대부분 어렵다.

결론적으로 객체지향적인 설계를 위해서는 단순히 추상화하는 것을 넘어, 객체를 소프트웨어 세계에서 능동적으로 행동하도록 의인화하는 것이 더욱 바람직하다는 것이다.

 

이상한 나라가 되어야 한다는 객사오가 옳다.


 

그 외에 기억에 남는 리뷰

 

레코드 생성자의 컴팩트 폼

 

이렇게 변경 가능하다

 


 

final 키워드를 파라미터에 사용하시나요?

 

레벨 1 코치, 네오가 코딩하는 것을 자주 본다.

모든 변수에 final 키워드를 붙이고 불변하지 않은 변수에서 final 키워드를 삭제하는 일반적인 사고의 반하는 스타일, 뭔가 멋졌다.

그래서 리뷰어에게도 이런 방식을 선호하는지 여쭤봤다. 케바케인듯

 

네오는 왜 쓰는지 모르겠으면 쓰지 말라고 한다. 결국 알게 될 거라고. 나는 아직 모르겠다.