귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!== 개요 == 프로그래밍에서 '''<code>NULL</code>'''은 "값이 없음" 또는 "아무것도 참조하지 않음"을 나타내는 특별한 값이다. 주로 변수, 포인터 또는 참조형 변수가 유효한 데이터를 가리키지 않을 때 이를 명시하기 위해 사용된다. 많은 프로그래밍 언어에서 NULL과 유사한 개념이 존재하며, 이를 통해 값의 부재, 미할당 상태 또는 오류 상황을 구분할 수 있다. == 역사 == <code>NULL</code>의 개념은 1960년대 ALGOL W 프로그래밍 언어에서 처음 도입되었다. 당시 컴퓨터 과학자 Tony Hoare가 이 개념을 도입하였으며, 후에 그는 자신이 도입한 이 개념 때문에 발생한 수많은 버그와 오류를 두고 "십억 달러짜리 실수(Billion Dollar Mistake)"라고 표현하기도 했다. 실제로 NULL 참조로 인한 오류는 오랜 기간 동안 소프트웨어의 안정성과 보안에 심각한 영향을 미쳐왔다. == 다양한 언어에서의 NULL == 각 프로그래밍 언어마다 <code>NULL</code>(또는 이와 유사한 개념)을 표현하는 방식은 다르지만, 기본적인 목적은 동일하다. 아래는 주요 언어별 <code>NULL</code> 처리 방법과 예시이다. === C/C++ === C와 C++에서는 <code>NULL</code>이 주로 포인터가 유효한 메모리 주소를 가리키지 않음을 나타내기 위해 사용된다. * '''C 언어:''' <code>NULL</code>은 일반적으로 <code>((void*)0)</code>으로 정의된다. * '''C++ 언어:''' 과거에는 정수 <code>0</code>이나 <code>NULL</code> 매크로를 사용했으나, C++11 이후에는 보다 명확한 <code>nullptr</code> 키워드의 사용이 권장된다. <syntaxhighlight lang="cpp"> int* ptr = NULL; // C 또는 C++에서 전통적인 NULL 사용 // C++11 이후에는 아래와 같이 사용 권장 int* ptr2 = nullptr; if (ptr == NULL) { printf("포인터가 NULL입니다."); } </syntaxhighlight> === Java === [[Java]]에서는 '''<code>NULL</code>'''이 참조형 변수의 기본값으로 사용되며, 해당 변수에 객체가 할당되지 않았음을 나타낸다. 단, <code>NULL</code>은 원시 타입(예: <code>int</code>, <code>boolean</code>)에는 사용할 수 없으며, <code>NULL</code> 참조의 메서드나 필드에 접근하면 <code>NullPointerException</code>이 발생한다. <syntaxhighlight lang="java"> String str = null; if (str == null) { System.out.println("문자열이 null입니다."); } </syntaxhighlight> === Python === [[Python]]에서는 <code>None</code>이라는 단일 객체가 값의 부재를 나타내는 용도로 사용된다. <code>None</code>은 조건문에서 <code>False</code>로 평가되며, 함수가 별도의 반환 값을 제공하지 않을 때도 <code>None</code>을 반환한다. <syntaxhighlight lang="python"> value = None if value is None: print("값이 None입니다.") </syntaxhighlight> === JavaScript === JavaScript에는 '''null'''과 '''undefined''' 두 가지 개념이 존재한다. * '''null:''' 개발자가 명시적으로 "값이 없음"을 표현하기 위해 할당하는 값이다. * '''undefined:''' 변수가 선언되었으나 초기화되지 않았거나, 객체의 존재하지 않는 프로퍼티에 접근할 때 반환된다. 특히, <code>typeof null</code>이 "object"로 나오는 것은 자바스크립트의 오래된 설계상의 오류이다. <syntaxhighlight lang="javascript"> let value = null; console.log(value === null); // true console.log(typeof null); // "object" </syntaxhighlight> == NULL의 위험성 == <code>NULL</code> 참조 오류는 프로그래밍에서 가장 흔히 발생하는 문제 중 하나이다. 유효하지 않은 <code>NULL</code> 참조에 접근할 경우, 프로그램은 예외를 발생시키거나 예기치 않은 동작을 보일 수 있다. 이러한 문제는 디버깅을 어렵게 하고, 심각한 경우 프로그램의 크래시나 보안 취약점으로 이어질 수 있다. <syntaxhighlight lang="java"> String str = null; int length = str.length(); // NullPointerException 발생! </syntaxhighlight> == 안전한 NULL 처리 방법 == <code>NULL</code> 관련 오류를 방지하기 위해서는 다음과 같은 방법들을 고려할 수 있다. * '''<code>NULL</code> 체크:''' 변수를 사용하기 전에 해당 변수가 null이 아닌지 항상 확인하는 습관을 들인다. <syntaxhighlight lang="java"> if (str != null) { int length = str.length(); } </syntaxhighlight> * '''Optional 사용 (Java 8 이상):''' <code>Optional</code> 클래스를 활용하면, <code>NULL</code> 여부를 내부적으로 처리하여 불필요한 <code>NULL</code> 체크를 줄일 수 있다. <syntaxhighlight lang="java"> Optional<String> optionalStr = Optional.ofNullable(str); optionalStr.ifPresent(s -> System.out.println(s.length())); </syntaxhighlight> * '''Null Object Pattern:''' 경우에 따라 <code>NULL</code> 대신 기본 동작을 하는 객체(<code>NULL Object</code>)를 사용하면, 클라이언트 코드에서 별도의 NULL 체크를 생략할 수 있다. == NULL 관련 모범 사례 == 프로그램의 안정성과 가독성을 높이기 위해 <code>NULL</code>을 다루는 몇 가지 모범 사례를 소개한다. === 변수 초기화 === 변수를 선언할 때 명시적으로 초기화하여, 불필요하게 <code>NULL</code> 상태에 머무르지 않도록 한다. <syntaxhighlight lang="java"> // 나쁜 예 String name; // 좋은 예 String name = ""; // 또는 실제 값으로 초기화 </syntaxhighlight> === NULL 대신 빈 컬렉션 사용 === 컬렉션이나 배열의 경우, <code>NULL</code>을 사용하기보다는 빈 컬렉션을 초기값으로 사용하는 것이 좋다. 이렇게 하면 이후 컬렉션을 순회하거나 조작할 때 추가적인 <code>NULL</code> 체크를 피할 수 있다. <syntaxhighlight lang="java"> // 나쁜 예 List<String> items = null; // 좋은 예 List<String> items = Collections.emptyList(); </syntaxhighlight> == 추가 고려 사항 == 대규모 소프트웨어 개발에서는 <code>NULL</code>로 인한 오류를 사전에 방지하기 위해 다음과 같은 추가적인 방법들을 고려할 수 있다. * '''정적 분석 도구 활용:''' 코드 리뷰와 함께 정적 분석 도구를 사용하여 NULL 관련 잠재적 오류를 미리 탐지한다. * '''언어 및 프레임워크 선택:''' 최근에는 <code>NULL</code> 대신에 더 안전한 자료형<ref>예: '''옵셔널 타입''' (Java의 <code>Optional</code>, Swift의 <code>Optional</code>) 또는 '''Maybe 모나드''' (Haskell의 <code>Maybe</code>)</ref>을 기본 제공하는 언어와 프레임워크가 등장하고 있다. * '''명확한 설계 원칙:''' API 설계 시, <code>null</code> 반환을 최소화하고, 필요한 경우 명시적으로 예외를 던지거나 [[Null Object Pattern]]을 적용하는 등 명확한 설계 원칙을 마련한다. == 관련 항목 == * [[포인터(프로그래밍)]] * [[메모리 관리]] * [[예외 처리]] * [[Optional 패턴]] * [[Null Object Pattern]] == 각주 == <references /> <!-- 분류 --> [[분류:프로그래밍]] 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림)