컴퓨터 입장에서 NULL과 0

awdxawdx101의 이미지

인터넷에 0과 NULL의 차이를 검색해보면 휴지심을 비유로 설명해놓은 사진들이 많습니다.

0 = 휴지심만 있고, 휴지는 없는 상태
NULL = 휴지심조차 없는 상태

여기서 궁금한게, 컴퓨터 입장에서 보면 NULL이나 0 모두 같은 0으로 인식하지 않나요?

휴지심 얘기를 들어보면 가슴으로는 받아들였지만 머리로는 받아들이지 못한(?) 느낌이 드네요.

라스코니의 이미지

휴지심과 휴지라..... 바로 이해가 되지 않네요.

우선 프로그래머는 컴퓨터가 절대로 도달할 수 없는 주소 번지를 가리키는 경우를 알수 있는 방법을 가져야 합니다. 왜냐하면 메모리 할당 요청을 실패했을 때 그 결과를 알려줘야 하기 때문이죠. 물론 할당에 실패했을 경우 음수 값을 리턴할 수도 있지만 메모리 주소는 unsigned int로 표시하는 것이 일반적이기 때문에 NULL(0, (void *)0)을 도입하기로 했습니다.

그래서 할당에 실패했을 경우 절대 도달할 수 없는 0 값을 사용자에게 되돌려줌으로써 할당이 실패했음을 알려줍니다.

김정균의 이미지

https://kldp.org/node/28150 참고
휴지심으로 비교 하기에는 영혼이 없는 것 같습니다. (일맥상통하지 않습니까?)

awdxawdx101의 이미지

지금 제가 듣기엔 토론 내용이 너무 어렵네요;;

익명 사용자의 이미지

소위 휴지심 비유는 모르는 사람한테 뭔가 깨우쳐 주기 위해 쓴다기보다는, 아는 사람들끼리 알아듣고 낄낄거리는 비유에 가깝다고 생각합니다. -_-;;

1. NULL이 정확히 무엇인지 알려면, 어떤 맥락(언어)에서 말하는 NULL인지가 분명해야 합니다.

예컨대 C언어에서 NULL은 null pointer constant입니다. 이는 0의 값을 가지는 정수 상수 표현식이거나 그런 표현식을 void * 타입으로 캐스팅한 것이죠. null pointer constant를 포인터 타입으로 캐스팅하면 그 결과는 null pointer가 되며, 이는 어떤 object나 function에 대한 포인터와도 달라야 합니다.

일반적으로 NULL은 뭔가 객체에 대한 참조가 들어갈 자리에 대신 들어가서, 유효한 객체를 가리키고 있지 않음을 나타내는 역할로 씁니다. 하지만 구체적으로 NULL이 무엇이고, 이걸 가지고 무엇을 할 수 있는지/없는지는 전술한 대로 언어 스펙을 따져봐야 합니다.

2. 프로그래밍 언어를 배우면서 "컴퓨터의 입장"을 함부로 넘겨짚지 않는 것이 좋습니다.

NULL의 의미가 프로그래밍 언어에 종속적이라면, 각 프로그래밍 언어가 "컴퓨터의 입장"에서 어떻게 나타나는지는 구현에 의존적입니다. 그리고 대개 여기에는 프로그래머에게 보여주지 않는 여러 가지 디테일이 있습니다.

C언어와 같이 비교적 저수준 취급받는 언어에서조차 (void *)0과 (long int)0이 같은 비트열로 나타난다는 보장을 하지 않아요. 물론 x86_64에 64비트 우분투를 쓰고 gcc 5.4로 컴파일하여 실행하면 저 둘은 같은 비트열로 나타납니다. 그 밖에 수많은 구현에서도 마찬가지로 같을 거에요.

하지만 이런 디테일이 프로그램 작성에 중요한 경우는 거의 없습니다. 프로그래밍 언어를 이제 막 공부하는 입장이라면 더더욱, 이런 디테일보다는 언어 스펙이 정의하고 보장하는 범위 안에서의 프로그래밍을 먼저 익히는 게 순서입니다.

god's developer의 이미지

뭔 뚱단지 같은 소리인지
그 형이란 분은 개발자가 아니라 무슨 소설가 같네요.
손절하세요.
개발자는 정확한 수치, 논리로 이야기하는겁니다.
허무맹랑한 소리 하는 개발자는 입만살았다고 다들 기피하죠

익명 사용자의 이미지

이 댓글에는 정확한 수치와 논리가 어디 있습니까?

익명 사용자의 이미지

이게 코드입니까 제코드에는 정확한 수치와 논리를 바탕으로 작성됩니다.
코드와 개발론을 설명할때도 마찬가지죠
NULL은 단지 0X00 으로 정의되어있는 상수일뿐이죠

익명 사용자의 이미지

자기 나름의 규칙을 내세워서 남을 비방하는 사람들은, 자기가 똑같은 규칙으로 지적을 받으면 말이 길어지더군요.

"사실 그 규칙에는 예외가 있는데, 그래서 나는 괜찮고 남은 안되고...", 뭐 이런 식이죠.

그건 그렇고, "NULL은 단지 0X00 으로 정의되어있는 상수일뿐이죠" 같은 단정을 하기 위해서는 조금 신중해질 필요가 있습니다. 위에서도 어느 분이 말씀하셨듯 이런 건 언어에 의존적이에요. NULL을 모두 대문자로 썼다는 점에서 C언어의 null pointer constant macro가 강하게 연상되긴 하지만, 여전히 단정할 수는 없지요.

익명 사용자의 이미지

단정할수 없는 이유는요???
님같은 부류들은 제가 잘알죠
그리고 상대의 논리에 반박을 위해서는 뭔가 evidence 하나라도 가져오셔야죠
언어에 의존적이다 라고 하실거면 NULL을 다르게 정의한 언어를 하나라도 가져 와보시죠.
그럼 상대해드리오리다

익명 사용자의 이미지

하나면 충분한가요?

C언어에 버금가게 대표적인 NULL의 용례는 SQL에 있지요.
https://dev.mysql.com/doc/refman/8.0/en/null-values.html

Q. SQL은 언어가 아니지 않느냐?
A. SQL을 범용 프로그래밍 언어라고 분류하기는 어렵겠지요. 하지만 여기서 "언어"를 "범용 프로그래밍 언어" 혹은 그 유사한 좁은 의미로 한정지어야만 할 이유는 없을 겁니다. 더군다나 SQL에서도 NULL과 0의 구분은 꽤 중요한 편이니까요. 꼭 그렇게 우겨야겠다면 저도 NULL 말고 null까지 포함해서 찾아도 됩니까?

GODDEV의 이미지

대단하시네요. 이젠 관계형 db 언어까지 가져와서 논리를 주장하시는데
두발 두손 다들었습니다.
차라리 언어를 하나 만드시고 NULL의 의미를 재 창조하시지요?
저라면 철학적으로 멋있게 NULL을 모든것이면서 아무것도 없는것으로 정의할것 같아요.ㅋㅋ

익명 사용자의 이미지

내가 말한 "언어"는 "관계형 db 언어"는 아니었다?

그것 보세요. 말이 계속 길어지잖아요. 제가 NULL 말고 null도 되냐고 물으면 안 된다고 하시겠죠?
뭐 괜찮습니다. 자신에겐 관대하지만 남에겐 엄한 사람들 어디 한둘인가요.

NULL의 정의를 논할 때 SQL은 고려 대상이 안 된다고 진심으로 주장하시는 것인지,
아니면 그저 지기 싫어서 그렇게 우기고 계신지는 모르겠습니다만, 좋습니다.

FORTRAN의 NULL은 어떻습니까?
https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gfortran/NULL.html
http://h30266.www3.hpe.com/odl/unix/progtool/cf95au56/lrm0301.htm

FORTRAN95에서 추가된 NULL은 disassociated pointer를 반환하는 intrinsic procedure입니다.

김정균의 이미지

linux 와 BSD 의 최신 버전에서는 다음과 같이 정의가 되어 있습니다. 실력이 모자르므로 판단은 하지 않겠습니다.

#ifndef NULL
# if defined __GNUG__ && \
    (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
#  define NULL (__null)
# else
#  if !defined(__cplusplus)
#   define NULL ((void*)0)
#  else
#   define NULL (0)
#  endif
# endif
#endif
ymir의 이미지

숫자로는 0 또는 (void *)0 이라지만, 별도로 NULL 로 명칭한 것은..
읽고 쓰는 사람에게 특정한 의미를 전달하기 위한 것이고..
그 의미란, '아무것도 가리키고 있지 않은 상태' 를 뜻합니다.

아무것도 가리키고 있지 않은 상태를 표시하기 위해, 어쨌든 어떤 값을 정의를 해야 할 텐데..
이왕이면 메모리 상에서 할당 불가능한 영역을 찾다 보니, 주로 0 이 사용되게 된 셈이죠.
실제로 0 외에 다른 값을 쓰는 시스템들이 있긴 합니다.
(http://c-faq.com/null/machexamp.html 참조)

컴퓨터 입장에서 NULL 이냐 아니냐는 중요하지 않습니다.
0 이든, 0 이 아니든, 프로그래머가 접근하라고 하면 접근할 것이고..
그러다 죽게 생겼으면 죽을 겁니다.

그 유효성을 판별해야 하는 것은 어차피 사람이니, 주소값에 0 도 의미있다고 가정하면 의미를 가지겠죠.

어쨌든, 0 은 이미 숫자 0 이라는 값 자체로 의미를 가지고 있는 상태이고..
NULL 은 원래 의미대로 '아무것도 가리키고 있지 않은 상태' 를 표시하기 위한 것으로 보면..
그 휴지심 비유도.. 좋은 예라고 보기에는 좀 그렇지만.. 딱히 나쁜 것 같지도 않습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ㅋㅋㅋ의 이미지

좋지도 나쁘지도 않은건 뭔가요?

ymir의 이미지

말 그대로 아무것도 가리키고 있지 않은 상태를 설명하기 위해서 굳이 비유가 필요하지 않으니까요.. ㅎㅎ
코드밥 먹는 사람을 이해시키기 위해서라면, 굳이 비유가 필요하지 않을 테고..
일반인이라도 이해못할 사람은 없을테니.. 그냥 가볍게 웃고 넘길 수 있는 정도..?

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

foobar_1의 이미지

듣고 보니 그렇네요.
굳이 추상적인 비유까지 필요하려나 생각이 듭니다.
바보가 아닌 이상에야 이해할텐데 말이죠.

haltagy의 이미지

으암마 nullptr 써서 숫자 0과 구분하는거 검색해서 보랑겡 잉

매일 1천억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키지않는. 야근 하는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 안받습니다.

익명 사용자의 이미지

0은 type은 있고 value는 없는 상태
NULL은 type도 없는 상태
를 말하려고 한거 같은데요.
(0이 value가 있는거냐 없는거냐는 또 관점에 따라서)

아는 형님이 휴지끈이 기시군요 ^_^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.