널 포인터 예외

배달 기사에게 주소가 적혀 있지 않은 빈 쪽지를 주면서 물건을 배달해오라고 시켰을 때 일어나는 사고예요.

정의 널 포인터 예외(NullPointerException)는 프로그램이 아무것도 가리키지 않는 텅 빈 메모리 주소(Null)를 참조하여 그 안에 있는 데이터나 기능을 사용하려고 할 때 일어나는 치명적인 실행 오류예요.

빈 주소로 심부름을 보낼 때 생기는 일

컴퓨터에서 변수는 물건의 위치가 적힌 메모지나 주소록과 같아요. 예를 들어 스마트폰 연락처 목록에서 친구 이름을 누르면, 컴퓨터는 그 이름에 연결된 전화번호 메모지를 읽고 전화를 걸어요.

그런데 친구 이름은 목록에 등록되어 있지만, 실제 전화번호 칸이 '비어 있음(Null)' 상태라면 어떻게 될까요? 이 상태에서 컴퓨터에게 무작정 통화 버튼을 누르라고 명령하면, 컴퓨터는 존재하지 않는 번호를 누르려다 크게 당황하며 작동을 멈추게 돼요.

여기서 '포인터'는 메모리 속 특정 데이터의 위치를 가리키는 손가락이고, '널'은 아무것도 없음을 뜻해요. 즉, 허공을 가리키는 손가락을 향해 물건을 집어 오라고 시키는 셈이에요. 종이(변수)는 손에 쥐고 있지만 종이에 적힌 실제 내용물(객체)이 텅 비어 있는 상황이죠.

널 포인터 예외 개념 다이어그램 친구 이름 주소: null 변수 (이름표) 예외 발생! 데이터 없음 실제 메모리 (객체)

앱이 갑자기 튕기며 꺼지는 진짜 이유

스마트폰 앱을 사용하다가 경고창도 없이 화면이 갑자기 꺼지거나 홈 화면으로 튕겨 나간 경험이 한 번쯤 있을 거예요. 이렇게 일상에서 마주치는 앱 강제 종료 현상의 상당수가 바로 이 오류 때문에 발생해요.

예를 들어 인터넷 연결이 불안정해서 서버로부터 프로필 사진이나 댓글 데이터를 제때 받아오지 못했을 때가 있어요. 준비된 데이터가 없는데 화면에 그림을 그리려고 명령하면, 컴퓨터는 텅 빈 공간을 강제로 열어보려다 에러를 터뜨려요.

미리 대비책을 마련해두지 않으면 프로그램은 더 이상 다음 코드를 실행하지 못하고 그 자리에서 쓰러져 버려요. 그래서 개발자들은 데이터를 다루기 전에 '혹시 값이 비어 있는 건 아닐까?' 하고 먼저 확인하는 사전 검사 코드(Null Check)를 꼼꼼하게 작성해야 해요.

조금 더 정확히 말하면: 10억 달러짜리 실수

컴퓨터 프로그래밍 역사에서 널(Null)이라는 개념은 아주 유명한 일화를 가지고 있어요. 1965년 영국의 저명한 컴퓨터 과학자 토니 호어(Tony Hoare)는 '값이 존재하지 않는 상태'를 손쉽게 표현하기 위해 널 참조를 처음 프로그래밍 언어에 도입했어요.

하지만 수십 년 뒤 그는 자신의 발명을 두고 10억 달러짜리 거대한 실수였다고 공식 석상에서 고백했어요. 널 값을 허용한 탓에 전 세계 소프트웨어에서 수없이 많은 충돌 사고와 보안 결함이 발생했고, 이를 고치는 데 천문학적인 비용이 들어갔기 때문이에요.

현대의 최신 프로그래밍 언어들은 이 오랜 고통에서 벗어나기 위해 똑똑한 안전장치를 기본으로 제공해요. 변수에 빈 값이 들어갈 수 있는지 여부를 프로그래머가 코드를 작성하는 순간부터 엄격하게 따지는 널 안전성(Null Safety) 기법이 현대 소프트웨어의 표준으로 자리 잡고 있답니다.

🤔 흔한 오해

✕ 오해

Null은 숫자 0이나 빈 글자("")와 완전히 같은 말이다.

✓ 사실

숫자 0은 '0이라는 값'이 존재하고 빈 글자도 '길이가 0인 문자열'이라는 실체가 있지만, Null은 아예 메모리에 할당된 대상조차 없는 '완전한 부재'를 뜻해요.

🧺 일상에서 만나요

1 로그인하지 않은 방문자의 정보에서 닉네임을 불러오려고 할 때 발생해요.
2 게시판에서 이미 삭제된 게시물의 본문 텍스트를 화면에 표시하려고 할 때 발생해요.
💡 그러니까 한마디로

아무것도 가리키지 않는 빈 메모리 주소를 찾아가 데이터를 달라고 요구할 때 발생하는 컴퓨터의 대표적인 오류예요.