Inflearn brand logo image

인프런 커뮤니티 질문&답변

eoyeong님의 프로필 이미지
eoyeong

작성한 질문수

Readable Code: 읽기 좋은 코드를 작성하는 사고법

리팩토링 (1) - 추상화 레벨

null을 가질 수 있는 값을 인자로 넘겨야 하는 경우

작성

·

202

·

수정됨

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

Optional을 인자로 받는 것이 안티패턴이라고 하셨는데
null을 가질 수 있는 값을 인자로 넘겨야하는 경우에는

그냥 해당 값을 Optional로 감싸지 않고 그대로 넘기고
받는 쪽에서 if문으로 null인 경우를 처리해주는 방법을 사용하나요??

답변 3

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 대영 님!

네, 자바에서는 암묵적으로 대부분의 타입이 null을 가질 수 있는 타입이기 때문에, 그렇게 처리하시면 됩니다.
파라미터의 Optional 이 안티패턴인 이유는, 메서드를 구현하는 입장에서 좋든싫든 반드시 Optional의 대한 케이스를 나누어 처리해야 한다는 점인데요. (Optional의 비용이 비싼 것도 한몫하고요.)
해당 타입을 그대로 넘기고, 메서드 구현부에서 null에 대한 케이스 처리를 할지말지 상황에 따라 선택하면 될 것 같아요.

다만, 애초에 처음부터 null을 발생시키지 않는 로직을 고민하는 것이 제일 좋습니다.
파라미터로 null이 넘어가지 않을 수 있도록 하는 다른 방법이 없을지, (ex. null 대신 LockerPass.EMPTY 같이 객체의 기본 인스턴스를 지정하고 사용한다던가) 항상 꼼꼼하게 고민해보는 것이 좋겠습니다.

감사합니다. 🙂

eoyeong님의 프로필 이미지
eoyeong
질문자

답변 감사합니다!

0

eoyeong님의 프로필 이미지
eoyeong
질문자

추가적으로

null일 수 있는 값을 인자로 넘기는 쪽에서는 orElse(null)로 값을 꺼내서 인자로 넘기는 방법은 좋지 않은 방법인지 궁금합니다.

20분쯤에 리팩토링하실 때,

 

StudyCafeLockerPass lockerPass = selectLockerPass(selectedPass).orElse(null) 
outputHandler.showPassOrderSummary(selectPass, lockerPass)

이런식으로 호출하면 될거라고 생각했는데

showPassOrderSummary 함수 내에서 lockerPass가 null인 경우에 대해서 처리를 해줌에도
ifPresentOrElse로 lockerPass가 null인 경우와 아닌 경우를 나눠서 showPassOrderSummary 함수를 호출하시길래 여쭤봅니다!

0

안녕하세요, 인프런 AI 인턴입니다. 대영님께서 질문하신 내용은 Java에서 Optional의 사용과 관련하여 자주 접하는 주제입니다.

Optional을 인자로 받는 것이 안티패턴이라 불리는 이유는 Optional은 주로 반환값에 대해 null 가능성을 처리하기 위해 설계되었기 때문입니다. 따라서 인자로 Optional을 사용하게 되면 API 사용자가 불필요하게 Optional을 만들어야 하고, 이는 오히려 코드의 가독성과 사용성을 떨어뜨릴 수 있습니다.

대신, 인자가 null일 수 있다면 다음과 같은 방법을 고려하실 수 있습니다:

  1. 명시적 null 체크: 호출하는 쪽에서 인자가 null일 수 있다는 것을 명시적으로 보여주고, 받는 쪽에서는 명시적인 null 체크를 통해 이를 처리하는 방법입니다. 이는 가장 직관적인 방법입니다.
   if (someValue != null) {
       process(someValue);
   } else {
       handleNullCase();
   }
  1. 다른 디자인 패턴 적용: 예를 들어, SomeService 클래스가 만들어진 목적이 모호하다면 입력 값에 따른 책임을 명확하게 하기 위해 조건부 패턴이나 책임 연쇄 패턴으로 리팩토링하여 null이나 값이 없음에 대한 처리를 구조적으로 해결할 수도 있습니다.

  2. 디폴트 값 사용: null 대신 사용될 수 있는 적절한 디폴트 값을 계층적 범위 내에서 정의하거나, null을 컴파일러가 이해할 수 있는 다른 의미(예: 특별한 고정 객체)로 대체할 수 있습니다.

질문하신 부분에 대해 좀 더 직접적인 사례와 답변은 아래 유사한 질문 URL에서 참고할 수 있습니다:

이러한 해결책으로 코드를 리팩토링하는 것은 유지보수성과 가독성을 높일 수 있다는 장점이 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

eoyeong님의 프로필 이미지
eoyeong

작성한 질문수

질문하기