해결된 질문
작성
·
79
·
수정됨
답변 2
6
예제에서는 사용자가 입력하는 명령어와 다양하게 변할 수 있는 파라미터를 함께 처리헤야 하기 때문에 가변 데이터를 포함할 수 있는 record를 사용하고 있습니다.
record를 사용할 때의 이점은 다음과 같습니다.
데이터만 다르고 행동은 동일할 경우 하나의 record를 이용해서 로직을 통일할 수 있습니다.
go north와 go east는 좌표만 다를 뿐 캐릭터를 이동시키는 로직은 동일합니다. 단지 방향에 따라 좌표에 더하거나 빼주는 값만 다릅니다. 따라서 direction을 속성으로 가지는 Move 레코드를 사용해서 이동 로직을 하나의 조건문으로(예제에서는 패턴 매칭을 사용했습니다) 처리하는게 유리하겠죠.
텍스트 어드벤처 게임에서 다양한 사용자 입력을 처리하기에 유리합니다.
record는 변하는 데이터를 포함할 수 있기 때문에 go north, go east, go west, go south처럼 다양하게 변하는 데이터를 포함하기에 좋습니다. Move라는 레코드를 선언하고 방향을 데이터로 포함하는게 동일한 로직으로 분기처리하게 되는 MOVE_NORTH, MOVE_EAST, MOVE_WEST, MOVE_SOUTH를 선언하는 것보다 수월합니다. 변경의 관점에서 다양한 사용자 입력 명령어를 처리하고 명령어별로 동일한 행동을 처리해야 한다는 점에서 enum보다 유리하다고 보시면 될것 같아요(이건 뒤의 아이템 처리 부분을 보시면 이해가 되실겁니다). 사용자가 명령어를 입력한다는 텍스트 어드벤처 도메인의 특성에 맞게 설계했다고 보시면 됩니다.
패턴 매칭에 유리합니다.
앞의 두 가지를 조합하면 명령어를 처리하기 위해 record와 가변 데이터를 조합하면 패턴 매칭을 이용해 로직을 편하게 처리할 수 있습니다.
그리고 말씀하신 직렬화 이슈는 제가 정확하게 알지 못하지만 현재의 도메인에서는 직렬화에 대한 요구사항이 없기 때문에 불필요한 고려사항입니다.
코드를 작성할 때마다 불필요한 제약을 고려해서 설계를 하게되면 코드가 필요 이상으로 복잡해지고 오버엔지니어링으로 이어진다는 점을 기억해 주세요. 🙂
0
안녕하세요, 인프런 AI 인턴입니다. Hika Maeng님, 질문 주셔서 감사합니다.
명령 객체를 구현할 때, sealed 클래스와 record를 선택하는 것은 특정 설계 의도를 가지고 있습니다. 이러한 구조를 사용하는 이유는 아래와 같은 다양한 이점을 활용할 수 있기 때문입니다.
안전한 타입 계층: sealed 클래스는 그것을 확장할 수 있는 클래스의 집합을 제한함으로써, 타입 계층을 안전하게 관리할 수 있도록 돕습니다. 이는 다형성을 활용하면서도, 클래스 간의 관계를 명확히 정의하려는 경우에 유용합니다.
간결함과 불변성: record는 데이터를 저장하기 위한 불변 객체를 아주 간결하게 정의할 수 있게 해 줍니다. 이는 주로 불변성을 강조하는 설계에서 특히 유용합니다.
자바의 새로운 기능 활용: 최신 자바 버전에서 제공하는 기능을 활용함으로써, 더 현대적이고 유지보수하기 쉬운 코드를 만드는 것이 가능합니다.
확장성 제약: enum은 상수 집합을 정의하는 데 적합하지만, 명령 객체처럼 복잡한 비즈니스 로직이 있는 경우 확장성과 유연성에서 한계를 가집니다.
상태와 행동의 분리: 객체지향 설계에서는 상태와 함께 행동(메서드)을 정의하는 경우가 많습니다. enum은 고정된 상수 내에서의 행동 정의에 한계가 있습니다.
Hika Maeng님께서 느끼시는 오버엔지니어링에 대한 고민은 충분히 이해합니다. 모든 프로젝트에서 이렇게 복잡한 구조가 필요한 것은 아닙니다. 프로젝트의 요구사항에 따라 복잡성을 조정하고, 단순한 구조를 유지하는 것이 낫다면 그렇게 하는 것이 바람직합니다.
하지만, 명령 객체의 경우처럼 명확한 타입 안전성과 불변성이 필요할 때에는, 새로운 자바의 기능을 활용하여 설계하는 것이 장점이 될 수 있습니다.
좀 더 관련된 논의를 보고 싶으시다면, 객체지향 설계에서의 계층 구조와 관련된 게시글을 확인하실 수 있습니다:
- 객체지향에서 다형성과 디자인 패턴의 활용
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.