• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

enum, sealed과 when

22.09.05 00:18 작성 조회수 176

1

안녕하세요! 강의 잘 보고 있습니다!

enum과 sealed를 when과 함께 쓰는 부분을 보고 궁금증이 생겨 질문드립니다!

제가 느끼기에 when 문은 자바의 switch문과 유사하다고 생각이 들어요. switch문이나 if-else 같은 경우 많이 사용하면 유지보수 측면에서도 힘들고 안 좋다는 의견을 많이 들었어요. 그래서 enum 각 내부 필드가 로직을 가지게 하여 if-else를 없애거나, 팩토리를 만들어 switch문을 최소화하거나 하는식으로 구현한다고 알고 있습니다.

이런 측면에서 if-else나 switch는 많이 쓰지 않는게 좋은 것 같은데 when은 조금 다르게 봐야하는건지 궁금합니다. 실제로도 when을 많이 사용하나요?

답변 1

답변을 작성해보세요.

4

안녕하세요! JS님~~ 크으으~~~ 너무너무 좋은 질문이십니다 ㅎㅎㅎㅎ

사실은 저도 Kotlin의 when expression을 처음 보았을 때 JS님처럼 switch case문과 유사하다는 느낌을 많이 받았습니다!!!

하지만 when expression에 익숙해지고, when 안의 각 조건 하나하나를 early return 처럼 바라보게 되니, when expression은 switch case와는 많이 다르고, 오히려 가독성이 괜찮다라는 생각을 하게 되더라고요!!

 

특히나, Enum 그리고 Sealed class를 when과 함께 사용할 때에 말씀해주신 것처럼 내부 프로퍼티로 할 수 있으면 괜찮고 저 역시 그런 방법을 선호하지만, 각 Enum 타입별로 외부 의존성이 필요하거나 프로퍼티로 해결이 어려운 경우에는 필연적으로 분기가 들어갈 수 밖에 없게 됩니다!! (만약 스프링을 사용하게 된다면, Enum이라는 POJO에 Spring Bean을 넣을 수는 없으니까요 😢

이럴 때는 외부에 when + enum or sealed class 조합을 적극적으로 사용하게 되고, 강의에서 말씀드린것처럼 새로운 타입이 추가될 때 IDE 단에서 누락된 로직을 직접 알려주다보니 정말 편리하다고 느끼고 있습니다 ㅎㅎㅎㅎ

특히나 Kotlin 1.5.x 까지는 IDE에서만 잡을 수 있었지만, Kotlin 1.6부터는 Compiler에서 warning을, 최신 버전인 Kotlin 1.7.0부터는 Compiler에서 error를 띄울 수 있어 더욱 안전한 프로그래밍이 가능합니다!!!

 

결론적으로, 저는 when 절을 다양한 경우 적극적으로 활용하고 있고 특히 Enum이나 Sealed Class와는 프로퍼티로 해결이 안되는 경우 잘 사용하고 있습니다.

 

관련해서, 글 서두에 언급드렸던 것처럼 제가 예전에 고민하며 작성한 글을 추가로 첨부드립니다!!

https://lannstark.tistory.com/139

이 글에 예제 코드들도 열심히 적어두었으니 코드와 함께 봐보시면 더욱 좋을 것 같아요~! 😊 그럼 혹시나 궁금한 점이 더 있으시면 편하게 질문 남겨주시고~ 오늘도 행복한 하루 되세요!!! 감사합니다! 🙏

 

luca님의 프로필

luca

질문자

2022.09.05

자세한 답변 감사드립니다! 저도 한 번 써보면서 편리함을 느껴봐야겠네요!