NULL 대신 컬렉션으로 대체하는 리팩토링
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 중급 이상의 소프트웨어 개발자
- Null 체크와 복잡한 조건문으로 인한 코드 유지보수 어려움이 있는 개발자
- 객체 지향 설계와 다형성 원칙을 적용하고자 하는 개발자
핵심 요약
- Null 값 대신 빈 컬렉션 사용으로 null 체크 제거
Optional
→List
- 다형성 및 예측 가능한 동작 구현
this.coupons.isEmpty()
대신this.coupon.isPresent()
- 코드 복잡도 감소 및 안정성 향상
NullPointerException
예외 제거, 조건문 단순화
섹션별 세부 요약
1. 문제점 도출
- Null 값 사용의 단점
if (this.coupon != null)
과 같은 null 체크로 복잡도 증가NullPointerException
발생 가능성- Optional 객체의 한계
Optional
은 모든 프로그래밍 언어에서 지원하지 않음Optional.isPresent()
메서드 사용으로 추가 복잡성
2. 리팩토링 적용
- Nullable 객체 → 컬렉션 대체
private Coupon coupon = null;
→private List
coupons = new ArrayList<>(); - 메서드 수정
redeemCoupon(Coupon coupon)
→coupons.add(coupon)
total()
메서드에서 null 체크 제거,for (Coupon coupon : this.coupons)
사용- 변경된 메서드 로직
hasUnsavedChanges()
→!items.isEmpty() || !coupons.isEmpty()
hasCoupon()
→!coupons.isEmpty()
3. 리팩토링 효과
- null 체크 제거로 조건문 단순화
if (this.coupon != null)
→for (Coupon coupon : this.coupons)
- 다형성 기반의 일관된 동작
- 빈 컬렉션과 비어 있지 않은 컬렉션 모두 동일한 메서드에 반응
- 코드 안정성 향상
NullPointerException
예외 제거, 모든 컬렉션은 최소 빈 상태로 존재
결론
- null 대신 빈 컬렉션 사용은 코드의 예측성과 안정성을 극대화
- 리팩토링 전략: nullable 객체를 컬렉션으로 대체하고, 모든 메서드를 컬렉션 기반으로 재구성
- 이유: '불가능한 상태'를 도메인 모델에서 제거하여 유지보수성 향상