9장. 옵션으로 null 처리하기
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
NullPointerExceptions많은 사람들이 참조를 null 억만장자 실수라고 합니다. 사실 의 발명가가 원래 이 문구를 만들었습니다: null
저는 이를 10억 달러짜리 실수라고 부릅니다.
1965년에
null참조가 발명되었습니다. 당시 저는 객체 지향 언어(ALGOL W)에서 참조를 위한 최초의 포괄적인 타입 시스템을 설계하고 있었습니다. 제 목표는 컴파일러가 자동으로 검사를 수행하여 모든 참조 사용이 절대적으로 안전해야 한다는 것이었습니다. 하지만 구현이 너무 쉽다는 이유로null참조를 넣고 싶은 유혹을 뿌리칠 수 없었습니다.이로 인해 지난 40년 동안 수많은 오류, 취약성, 시스템 충돌이 발생하여 수십억 달러의 고통과 피해가 발생했을 것으로 추정됩니다.
찰스 안토니 리처드 호어 경, (QCon 런던 2009)
이 '실수'를 처리하는 방법에 대한 절대적인 합의는 없지만, 많은 프로그래밍 언어에는 null 참조를 처리하는 적절하고 관용적인 방법이 있으며, 종종 언어 자체에 직접 통합되어 있습니다.
이 장에서는 Java가 null 참조를 처리하는 방법과 Optional<T> 유형 및 해당 기능 API를 사용하여 코드에서 이를 개선하는 방법을 보여주고, 옵션의 사용 방법, 시기 및 사용하지 말아야 할 경우에 대해 알아보세요.
널 참조의 문제
Java의 값 부재 처리 방식은 유형에 따라 다릅니다. 모든 프리미티브 유형에는 기본값이 있습니다(예: 숫자 유형의 경우 0, boolean 의 경우 false ). 클래스, 인터페이스 및 배열과 같은 비 프리미티브 유형은 변수가 어떤 객체를 참조하지 않는다는 의미로 할당되지 않은 경우 기본값으로 null 을 사용합니다.
참고
참조 타입의 개념은 C/C++ 포인터와 비슷해 보일 수 있지만 Java 참조는 reference 라는 JVM 내부의 특수한 타입으로, JVM은 타입 안전을 보장하고 메모리 액세스를 보호하기 위해 이를 엄격하게 제어합니다.
null 은 실제 유형과 관계없이 모든 객체 참조에 사용할 수 있는 일반화된 유형이기 때문에 null 참조는 "아무것도 없는" 상태가 아닙니다. null 참조에 액세스하려고 하면 JVM은 NullPointerException 을 던지고, 이를 적절히 처리하지 않으면 현재 스레드가 충돌합니다. 이는 일반적으로 예제 9-1에서 보는 것처럼 런타임에 모든 곳에서 null 검사를 요구하는 방어 프로그래밍 방식으로 완화할 수 있습니다.
예 9-1. 널 가능성이 있는 지뢰밭
recordUser(longid,Stringfirstname,Stringlastname){Stringfullname(){returnString.format("%s %s",firstname(),lastname());}Stringinitials(){return ...