예 안녕하세요 포프입니다.
음..
오늘도
자다일어나서
만드는데
일요일이라 저는
오늘 할 이야기는
Null 에대해서 이야기해보려고 해요
그...
굳이  C만이 아니라 Java를 쓰거나 C#을 쓰거나
그래도 이제
Null이라는걸 대입을 하자나요 그 오브젝트 같은거에
저도이제 그냥 뭐 이렇게 쓰는거구나 하고 쓰다가
언제 한번 이제...
과연 null이 좋은거냐 아닌거냐 라는
그런 여러가지 이제... Debate?
토론이 붙은걸 보고나서
그중에서 어떤사람이 한 얘기를 보고
null에 대한 이제 좀...
개념이 더 확실하게 잡혔었거든요?
몇년 됬는데... 좀 오래된거 같은데
그..
예를들어서 그 뭐지?
C++을 만들었던 그... 아저씨 이름 까먹었는데
bjarne stroustrup (비아네 스트럽스트라포?)
뭐 이상한 이름 있자나요
그아저씨는 이제 C++을 만들때  되게
킁
후회하는게 이제 포인터를 없애지 않은거란 이야기를
한걸 본적이 있어요
물론 그아저씨가 포인터를 없앴더라면
c++이 지금까지 이렇게 써질꺼 같진 않은데
그래서 그아저씨가 이제
좀더 안전한... 언어 디자인을 하는.. 부분에서는
그걸 후회할수 있겠지만
제 생각에는
그거는
슷
오히려 현재 C나 C++이
C는아지니 C++이 이용되는
그.. 뭐라그럴까 현상을
죽이는 그런 상황?
그래서 오히려 그런일이 있었으면 c++은
게임 업계에서 안쓰일고 있었을꺼 같은데
그
일단 null이쓰인다는 거는 뭐냐면
자바를 쓰는사람들이 특히나 이제
착각을 많이하는 것중에 하나가
아~ 자바에 포인터가 없어
막 이런 이야기를 해요
근데
솔직히 말하면 자바는 다 포인터에요
그래서
슷
null이 있다는거 자체가 일단은
아 뭐라그럴까... 음....
동적으로 오브젝트를 만들어서
그 오브젝트를 주고받으면서
레퍼런스로 참조를 하는 경우가
대부분이라고 보거든요 뭐 반드시 그래야하는건 아니지만
어쨌든 자바도 그렇게만들었고
c#도 그렇게 만든거에요
그래서
거기에는 이제 포인터 연산이 없을뿐이지
그 포인터가 메모리 어디를 가르키면
그 메모리 위치를 바꿀수 없다는거 뿐이지
실제 Java에서 존재하는 모든 오브젝트는
포인터 기반이라고 하면 맞아요 레퍼런스기 때문에
그러면
포인터가 뭐냐
예전에 그런 이야기를 했었어요
비디오에서 말한적도 있었고
영어를 알면 프로그래밍을 잘할 수 있단가?
뭐... 프로그래밍에 도움이 된단가
그런 비디오에서 말했던거 같고
포인터는 결과적으로
어떤 메모리 주소를 저장하는 변수에요
그러면
그 메모리 주소엔 어떤내용이 있을까
그 내용에 따라 포인터를 참조라고 하나 역참조라고 하나
참조가 맞는거같아요
잘 모르겠어요
그래서 C에서 스타싸인 집어넣으면 되는거 별표싸인
그거를하면 이제 거기서 데이터를 꺼내와서
쓰거나 읽거나 덮어쓰거나 하는거거든요
그래서 결과적으로 포인터는 주소를 가르키는 변수에요
그러면 만약에 이 주소를 가르키는 변수에
null 값이 들어가면 어떻게 되냐
null이라는게 결과적으로는 그냥
0이라는 그런 비슷한 개념이거든요
그려면
null이들어갔을때는
이거를 아무것도 가르키지않는 주소로 본다
결과적으로 이 주소값이 없다고
본다 라고 해서 null이나온거에요
그러면 재밌는게
포인터 라는거 에서는 그러면
두가지 값이 있을수가 있어요
하나는 제대로된 주소값 다른거는 제대로되지않는 주소값
그래서 실제 포인터나 아니면 자바에서 오브젝트 같은 경우
그게 가르키는 값은
그거에 가지는 값은
유요한 오브젝트의 주소 오브젝트 값을 한번 참조하면은 가질수있거나
아니면은
아 이것은 아무것도 가르키고 있지 않는다
그니깐 이거는 잘못된 변수다
현재상태는 아 valid 한게 아니다 invalid드한거다
라는걸 나타내는 상태가 들어가는거에요
그래서 어떻게보면은 포인터가 들어오고 null이생기면서 부터
이변수에 들어가는 값은 둘중에 하나가 되는거죠
제대로된 오브젝트 아니면은 상태
그래서 null을 지지하는 사람들의 이야기는
null이라는건 되게 좋은거다 왜냐하냐면은
변수하나로 상태와 실제변수를 표현할수있다고 이야기를해요
그런데 이게...
함수를 많이짜본사람들은 알겠지만
함수에서 보통 리턴값이 하나인 언어가 많자나요
파이썬같은건 아니지만 뭐 자바, C, C#같은경우는
기본적으로 리턴값이 하나라고요
그럼 거기서 어떤함수에서 무슨연산해서 반환했는데
이 리턴값이 올바를수도있지만
아니면은 그 함수에서 데이타베이스 긁는다거나
그런걸 못찾았어
그럴 데이타베이스 엔트리를
그럴대 과연 이값을 어떻게표현할꺼라냔 문제가있거든요
그래서이제 null이있음으로해서
변수하나만 반환해서
그 상태와 제대로된 값을 둘다 표현할수있는게 null이라서
null이좋다라는 이야기가있고
아니면 다른쪽이야기는
아~ 왜 하나에 두개를 긁냐
차라리 하나만넣고 함수를 하나더 만들어라
아 여기에 이런 데이타가 있냐
트루
폴수
불린을 반환한다음에
이제 그다음에 그 다시 다른함수를 호출해서
값을 가져오는 방식
근데 API 디자인 측면에서는 좀 에매하죠
왜냐하면 이함수를 호출하기전에 반드시 다른함수를 호출해야만한다는걸
강제해야하는데
규격상으론 강제가 안되고 coding pratice(?) 상으로
강제를 해야하니간 좀 어려운거고
그래서이제 그거를 해결하기위해서
C#중에 Tryparse 이런쪽에 계열에 함수를 보면은
Boolean을 반환하면서 제대로 됬는지 안됬는지 알려주면서
Palse한 데이터를 아웃 파라미터로 뽑아는게 경우가 있죠
래퍼런스로 뭐 뭐라그러지 변수를 줘서
그변수의 값을 대입해서 나오는
그래서 그런 꼼수가 나왔고
개인적으로 API디자인 측면에선
Traypalse같은게 훨씬 낫다고 생각을 해요
함수호출하나로 두가지를 끝낼수잇으니깐
근데 그런게아니라 오브젝타입이라면
어차피 null이반환이 되는거라면
null을 반환함으로해서 상태도 볼수있단 장점도 있죠
그래서 이제 어떤함수는 null은 반환하는 경우가 있고
어떤 함수는 null을 반환하지 않는경우가 또 있기때문에
그함수내부를 까보지 않으면 그 판단을 내리기 매우 어려운 경우도 많고
단점도 있긴 해요
주석을 잘다는 법도 있지만
저 개인적인 경우에는 Null을 반환하는 함수면은 언제나
리턴값 표현하는 주석에
보통 함수 제일위에 주석을 달자나요
Null을 반환하는 함수는 언제나 주석을 달아서
리턴값에 "Null" 그렇게 써놓고
If nothing found 그런식으로 넣고
그런식으로해서 null
을 반환하는 함수를 주석에 반드시 쓰는 습관을 들였어요
그래서 null이 좋은거냐 나쁜거냐
저 개인적으로는 null을 좋아해요
null포인터가 들어갈수있는 오브젝트를 되게 편하게 생각을해요
리턴을 하나만 할수있다는 장점?
그리고 어차피 C#이나 자바류는 모든게 포인터인데
구지 포인터에서 리턴을 두번함으로해서
효율성을 뭐 차이는 없겠지만 실제 컴터 도는데에서
굳이 그게 효율에서 좋지도않고 굳이 사용할때 훨신 편한것도아닌데
굳이 그래야하나 생각이 드니깐 그런것도있고
정말 표준화 되게 여러가지를 반환하는 경우가 있어요
그런경우에는 아에 구조체를 만들어서 구조체를 반환하기도해요
구조체같은걸 만들어서...
뭐 클래스라 해야하죠 자바에서는
제너릭같은걸로 만들면 c#에서
데이터를 밑에넣고 그위에는 Success인지 Fail인지를 넣을수있는 방법도 있기때문에
그런것도 쓰는데
그거는 이제뭐라그럴까
음 c#에선 Class하고 structure 하고 달라요
스트럭처는 값이고 솔직히 null이 없는게 정상이고
클래스는 이제 오브젝트이기때문에 Null이있는게 정상이고
그리고 이제 보통우리가 말하는 기본형식 데이터들 있자나요
Integer Double
이런것들도 사실은 null이 안들어가는 그런 변수거든요
값으로 카피하는 변수기 때문에 그런 타입이기 때문에
그런거까지 한번에 표현해서 null을 넣을라면은
그런식으로 구조체를 만들어서 하는법이 있고
아니면 리턴값을 Nullable로 하는법이 있죠
C#이 자바보다 나았던게 뭐나면
자바는 primitive타입 빼고는, 기본타입 빼고는
뭐든게 다그냥 클래스에요 오브젝트 개념이고
값을 패스할 수 있는 방법도 없고
값을 하나 만든다음에 이걸 복사를 안하고 패스한 다음에 뭐 뭐라그럴까
음 그니깐 실제 원본을 바꿀있냐 없느냐의 문제인거 같아요
값이냐 오브젝트냐는
오브젝트를 패쓰하면 래퍼런스를 패쓰한거기 때문에
그 원본을 곧바로 바꿀있는 반면에
스트럭처로 패스하면 원본을 못바꾸기때문에
그 값만 쓰는 API적인 강점이 있거든요?
내가 패쓰했는데 함수가 내껄 바꾸면 기분이 나쁘자나
그런거를 강제하는 방향에서 c#에 방향은 좋다고 생각했는데
struct 와 클래스 이야기는 한번더 할 일이 있을꺼에요
생각보다 방향은 좋은데 쓰기또 되게 애매한게 그부분이라서
정말 코딩 표준화를 잘해놓지않으면 정말 고생을 많이하는 부분이라서
그것도 좀 고민이 되고
어쨌든
Null이 그냥 뭔지모르고 막 Null쓰고 무조건 Null검사하고 되게많아요
그냥 스트링을 자기가 만들어넣고도 반드시 Null이 아닌데
일단 만들어 놓고도 다음코드에 쓰면은
그 개념이 없기 때문에 무조건 Null채크하고 그런사람들 있거든요
Null이라는건 그냥 그렇게 생각을 했으면 좋겠어요
기본적으로 이게 오브젝트 가르키는 맞는데
그게 안될때 이 오브젝트가 올바른 상태가 아니다 오브젝트가 없다.
라고 할때 Null을 집어 넣는거라 생각하면 될꺼같고
똑같은거를 Integer나  Double에서도 쓰긴 써요
어떤거냐면
예를 들어서 C#에서 리스트라던가
C에 이제... 뭐.. 뭐지..
Find 같은 함수있자나요  STL에서, 컨테이너에서
그런 함수를 쓰면은 아무값도 찾지못하면 -1을 줘요
어레이에서 뭔가를 찾아야하는데
그 엘리먼트를 찾지 못할 경우에는 negative값을 주는거야
왜냐하면 에레이 인덱스는 영부터 시작해서 양수로만 가자나요
근데 -1을 준다는 것은 존재할수 없는 값이기때문에
그걸로 상태가없다 엘리먼트를 채울 수 없다 라는걸 표현 하겠다는거죠
결과적으로는 유요한 범위중에서 어느 한값을 빼서
이값이 잘못된 것이라는것을 표현할때 쓰는거거든요
이것도 어차피 null이라고 똑같은 개념인데
그게 -1이될지
-Max가될지
뭐... Double쓸때는 MaxValue 도 쓰고 MinValue도 쓰자나요
그런식으로 해서 어떤 특정값이 잘못된 값이다 라고 하면 이제
sentinel값이라고 하는거 같아요
그값을 표한하겠다는건데
문제는 이거는 완벽히 정의된 Convention(?)이 없어요
내가 어레이같은 걸 뒤질때 - 1 sentinel Value로 쓸수도 있고
아니면 -10을 쓸수도있거든요
그래서 그런거를 쓸때는 이제 #Define을하거나
Const를 만들어서 이름을 정해준 Constant란 말이죠
상수인데 이름정해진 상수
그래서 문제를 막자는 이야기가 있지만
이미 각각 값을 나타내는 변수에서 그렇게 하는걸을
레퍼런스로 나타내는 변수에서는 Null이라는 정해진 주역이 있다라고 생각하면 되는거 같아요
null이 좋냐 나쁘냐를 논하는 사람도있지만
null이 뭐 나쁜거다... 라고 이야기를 하지만
어차피 null을 쓰지 않는이상
아까 말했듯이 함수를 여러개나눠서 Boolean으로 강제하면은
코딩스텐다드나 코딩 Pratice(?)에서 강요를 해야 되는데
그거는 더더욱 강제성이 없어서 조금 애매하고
어차피 뭐 만약에 무슨 어레이를 뒤지거나 이럴때 그러면
인티저값을 써서  -1값을 반환하는 이런 방식도 쓰기 때문에
어차피 Sentinel 값을 써야하는 상황이라면
이미 정해진 Null Sentinel 값이 조금더
사람들이 이해하기 쉽고 누구나 다 이해할 수 있는거니깐
좋은거라고 생각을 하고
아 그리고
만약에 구조체같은거는 그 오브젝트를 따로 만들어서
모든 함수가 이 오브젝트를 반환하게 만든다
그러기가 실패했는지 성공했는 Boolean값이 있고
그다음에 템플릿 제너릭으로
이제 어떤 데이터를 넣었고 데이터를 가져오게 한다면은
그것도 나쁘지않다고 생각은 해요
모든 함수를 그렇게짜긴 굉장히 많은 일이 있어야하고
어떤 라이브러리 레벨에서 그냥
아 이 라이브러리는 언제나 이 반환값을 반환한다.
라는거에서는 나쁘지 않았아요
물론 이렇게 까지 이야기하면 또
Null값이나 이런거 대신에 exception을 던져서
그 exception을 캡치해서 Null상황을 Catch하겠다
잘못된 상태를 Catch하겠다라는
또 그런 망상을 할수있는 부분도 꽤 봤는데
그게 올바른 방향일때도 있지만
아닌 경우도 더많이 봤어요
exception이라는건 그대로 내가 예상하지못한 그런상황에 exception일 뿐이지
내가 이미 충분히 예측가능한 상황은 exception은 아닐꺼 같아요
그거는 오히려 뭐라 그럴까
음...
주로 쓰이는 그런 그런 뭐라 그래요
유요한 값들과 무효한 값이있는데
무효한값이 들어올 수 있다는 가정이 있으면
그거를 이제
제대로 처리해서 이 상태가 잘못됬다는걸 알려주는게 나은거지
exception을 마구 더지면 그거는 조금... 오히려 exception의 남용같아요
그게 저는 exception관련 비디오에서 몇번 이야기 했지만
그렇게 코드를 짜다보면
흔히들 말하는 코드 가독성이 좋아진다고 하지만
그건 완전히 구라인거같고
오히려 가독성이 되게 안좋아지고
사람두뇌가 코드가 중간에 여기서 저기로 뛸 수 있다라고 생각하는게 되게어려워요
GOTO를 쓰지 말라고 했다는 이유와 비슷하거든요 사실은
GOTO는 명시적으로 어딜 가라고 써잇지
exception은  코드가 실행되다가 하나 잘못되면 튀어나가기 때문에
그거는 아닌거 같고 음...
예전에 뭐 exception 관심있으신 분들은
제가 만들어놨던 비디오중에
exception은 이제 바운더리에서만 체크하라는 이야기를 제가 한적이 있어요
제가 바운더리 케이스는 긍까 뭐라그럴까
이 라이브러리에서 내 라이브러리 접근권한이 없는데
함수를 호출하는데
내가 기대하는 값과 전혀 다른 값과 전혀 다른값이 들어는경우가 있자나
그럼 그 경게선에서 exception 체크해서 모든것을 exception을 던지든
애러코드를 돌리든
그건 거기서 처리를 하고
내 그 경계를 넘어와서 내 라이브러리에 들어오는 순간
그 순간에는 모든 데이터가 이미 유효한 데이터니깐
그거에 가정해서 쓰란 이야기를 한적이 있어요
내가 라이브러리 클래스가 천개있는데 천개에서 exception 던지면서
서로 이렇게 캣치하는 이상한 짓을 안해도되고
그에 비해 이제 한군데서 exception을 캐치하니깐
여기만 주위하면은 그안에는 유효한 값이 들어오고 하는거죠
그 마지막으로 exception이야기가 나왔으니깐
비유를 들자면 이게 뭐나면
자동차를 몰다보면은 자동차에 들어가에 기름이 다른종류가 있어요
내차에는 경유가 들어가고
다른차에는 휘발류가 들어가고
어떤 차에는 가스가 들어가는 차가 있어요
그러면 내가 주유소에서 이 휘발류를 넣을때
어떤 휘발류인지 어떤 경우인지는 종류를 잘골라서 넣는거만 주위하면 되는거자나요
근데 여기서 만약에 경유를 늘려고 그러면
경우넣는 그 구멍있자나요
그거는 휘발류와는 달라요
경우가 휘발류차에 안들어가거나 휘발류가 경우차에 안들어가거나
그 노즐이 안들어가게 되있거든요
그게 exception헨들링이란 이야기에요
그니깐 내 차에 처음부터 경유나 등유가 못들어오게 그런 예외상황을 막고
인터페이스에서
그게 끝난경우에 내차에 이미 들어온 휘발류는 휘발류니깐
휘발류라고 가정하고 엔진을 돌리겠다는거에요
근데 이 exception핸들링을 잘못쓰면은
아 경우와 휘발류가 언제든 들어올수 있으니깐
막 이게 튜브를 해서 이렇게 집어넣을수도 있으니깐
그 들어온 순간 그거를 처리하기 위해서 엔진을 두개를 단다거나
엔진을 경유가 들어왔을때 어떻게 작동하는지를 예외상황을 만들어놔
그안에서 해결을 하면서 자동차를 계속 돌게 만들다거나
그런 이상한짓을 하는거에요
뭐 똑같은 이야기로 AAA배터리 들어가는데
AA배터리 넣고 난리치는거나
뭐 그런 예가 있죠
아니면 뭐 배터리도 마이너스 플러스 있자나요
마이너스 플러스 뒤집어 넣었을때
그게 돌게하기위해서 내부시스템을 만든다거나
이런 개념이 잘못된 exception 헨들링 인거같아요
exception 헨들링은 말그대로 경계에서만 하자
그래서 이야기가 또 길어졌는데
언제나 그렇지만
오늘 할려고 했던 이야기는
null이라는게 그냥 아 그냥 null이니깐 쓰자가 아니라
오브젝트가 있고 그 오브젝트가 상태가 이제 제대로된 오브젝트가 아니다
이 오브젝트는 존재하지않는다
라는걸 상태라는 개념을 포함하기위해 null을 추가하는거고
실제 그 클래스나 오브젝트들 그리고 포인터 C에서는
null이라는게 존재하는 이유가
아 이게 유효하다 아니다와
이게 실제 값이 있다를 표현하기 위해서 두개를 합쳐둔거다
그래서 그 두개를 쓰는건 나쁘지 않다고 생각을하고
오히려 저는 선호하는데
뭐 그런여러가지 따른 방법도 있다는걸 말씀드리고 싶었어요
그래서 음 그리고 null 체크를 뭐라그럴까
그 뻔히 null이아닌데서 null체크좀 하지말자라는 이야기도 하고싶었던거 같고
최근에 그런코드를 본적이있어서 암이걸렸기 때문에
그래서 null이란 이런거다 라는 포인터? 비디오를 만들었네요
네 포프였습니다
