Valid State

2025-09-20

내가 생각하는 OOP의 핵심은 “객체는 생성되는 순간부터 유효한 상태(valid state)여야 한다.”이다.

OOP의 Message Passing 같은 개념도 있지만, 실무적으로는 객체의 상태 유효성이 더 중요하다고 생각한다.

실제로 애플리케이션 버그의 상당수는 객체가 유효하지 않은 상태일 때 발생한다. 부분적으로 초기화된 객체를 사용하다가 NPE를 만나거나 다른 여러 버그를 만들어내는 식이다.

이러한 객체의 불완전한 상태는 주로 Setter나 Default Constructor를 남용하면서 허용된다.

생성자의 가장 중요한 목적은 유효한 상태를 가진 객체를 만드는 것이다. 생성자에서 필수 매개변수를 모두 받아 객체의 불변식을 만족시키면, 객체는 생성된 직후부터 올바르게 동작할 수 있다. 이를 통해 부분 초기화나 NPE 같은 많은 문제를 원천적으로 해결할 수 있다.

반면 Setter 호출 패턴을 사용하면 코드 수준에서 무엇이 필수이고 무엇이 선택인지 강제하지 못해 문제가 발생할 가능성이 높아진다.

하지만, JSON 역/직렬화처럼 Setter가 필요한 경우도 있다. 이럴 때는 별도의 래퍼나 인터페이스 기반의 안전장치를 마련해, Setter를 사용하는 코드를 애플리케이션의 로직과 완전히 분리하는 것이 올바르다.