49. 매개변수가 유효한지 검사하라

매개변수가 유효한지 검사하라

메서드와 생성자가 기대하는 제약사항을 문서화하고 명시적으로 검사하기

매개변수 검사가 중요한 이유

  • 메서드 본문 실행 전에 오류를 빠르게 감지할 수 있다

  • 오류 원인과 위치를 정확히 파악할 수 있다

  • 실패 원자성(failure atomicity)을 지킬 수 있다

검사하지 않으면 발생할 수 있는 문제

  • 메서드 중간에 모호한 예외가 발생한다

  • 메서드가 잘못된 결과를 반환할 수 있다

  • 객체가 불안정한 상태가 되어 미래에 예상치 못한 오류가 발생할 수 있다

Image

매개변수 검사 방법

일반적인 검사 방법

Java 7부터 도입된 유틸리티 메서드

private 메서드에서는 assert 활용

✔️ 특징

  • assert는 개발 중에만 활성화된다 (-ea 또는 --enableassertions 옵션 필요)

  • 런타임에는 성능 저하가 없다

  • private 메서드는 호출되는 상황을 통제할 수 있으므로 assert로 충분하다

특별한 상황들

📌 생성자 매개변수 검사

✔️ 중요성

  • 생성자는 객체의 불변식을 보장하는 첫 번째 방어선이다

  • 잘못된 객체가 생성되는 것을 막을 수 있다

📌 필드로 저장하는 매개변수

✔️ 특징

  • 나중에 사용하려고 저장하는 매개변수는 특히 더 신경 써서 검사해야 한다

  • null이 저장되면 나중에 NullPointerException이 발생할 수 있다

📌 고비용 검사와 암묵적 검사

고비용 검사

암묵적 검사

✔️ 주의사항

  • 예외적인 상황에서만 검사를 생략한다

  • 문서화를 통해 제약조건을 명확히 한다

  • 암묵적 검사에 과도하게 의존하면 실패 원자성이 깨질 수 있다

실패 원자성 보장하기

✔️ 실패 원자성이란?

  • 메서드 호출이 실패하더라도 객체는 호출 전 상태를 유지해야 함

  • 매개변수 검사는 상태 변경 전에 수행해야 함

표준 예외 사용하기

예외 타입
사용 시기

IllegalArgumentException

인수 값이 부적절함

IndexOutOfBoundsException

인덱스가 범위를 벗어남

NullPointerException

null 값이 전달됨

IllegalStateException

객체 상태가 메서드 호출에 부적절함

ConcurrentModificationException

허용하지 않는 동시 수정 감지

UnsupportedOperationException

호출한 메서드를 지원하지 않음


🧩 어려웠던 점

  • 너무 엄격하면 유연성이 떨어지고, 너무 느슨하면 안정성이 떨어진다

  • 성능이 중요한 상황에서 매개변수 검사와 성능 사이의 균형을 잡는 것

  • 여러 매개변수 간의 복잡한 관계를 검증하는 코드를 깔끔하게 작성하는 것

💭 느낀 점

  • 매개변수 검사는 API의 사용성을 높이고 오류 메시지를 명확하게 해준다

  • 제약조건을 명시적으로 검사하는 것은 코드의 의도를 분명히 드러내준다

  • 유틸리티 메서드(Objects.requireNonNull 등)를 활용하면 코드가 더 간결해진다

Last updated