3일을 내리 쉬고 왔더니 또 온몸이 아프다. 쉬는 날엔 낮잠이 최고여! 그래서 그런지 잠을 또 늦게 잤다. 오늘은 stringifyJSON을 간략하게 배우고 이번 섹션의 취지는 바로 재귀이기 때문에 재귀를 이용해서 strigify 함수를 직접 구현하는게 오늘 오전의 과제였다. 처음엔 일어난지 얼마 안돼서인가, 문제의 의도부터가 이해가지 않았다. 한시간 정도를 이게 뭘까 고민하다가 시작했는데. 생각보다 쉽지는 않았다.
일단 JSON이란 무엇일까?
JSON은 데이터 교환을 위해 만들어진 포멧이다.
예를 들자면 어떤 객체 내용을 네트워크를 통해 다른 프로그램으로 전송을 한다고 가정한다. 그러나 발신자와 수신자가 모두 같은 프로그램을 쓰면 큰 문제는 없을것인데, 만약 다른 프로그램(예를들어 난 자바스크립트 상대는 파이썬)을 쓴다면 그 객체의 해석에서 분명 차이가 있고 오류가 날 것이다.
이러한 문제를 해결하기위해 생겨난 포멧이다.
그럼 어떤 방식으로 내용을 전달하여야 할까? 객체를 문자열로 변환하여 획일화 된 형태로 보내는 것이다. 이 stringifyf를 하는 과정을 직렬화라고한다.
예를 들자면
let obj = {name: 'sangrae',
age: 20,
message: '안녕하세요?',
}
위의 객체가 있다고 치자 이걸 stringify 하면
console.log(JSON.stringify(obj));
// {"name":"sangrae","age":20,"message":"안녕하세요?"}
결과처럼 {}가 붙고, 문자열엔 ""가 붙어서 나오고 객체의 속성과 값은 :로 붙어서 나온다. 그 외에도 함수와 undefined는 무시하고 배열일 경우 객체와 비슷하게 ,로 나누어져 []에 들어간 문자열이 나온다.
여튼 위의 JSON.stringify를 직접 구현하는데 알게된 한가지를 설명하자면, 구현중 배열과 객체를 구분하여야 하는 기점이 있었다. 간단하게 배열은 Array.isArray로 하였고, 배열을 걸러줬으니 typeof를 이용할 때 object로 나오는 건 객체 밖에 없다는 생각을 했다. 그러나...
console.log('typeof null: ',typeof null)
위의 결과는 무엇일까? 나는 당연히 primitive 타입으로 객체가 아니기에 그냥 null로 나오지 않을까 싶었다. 그러나
이걸 보고 조금 어지러웠다... 자바스크립트 한테 뒷통수 한대 맞은 기분이다... 이건 간단하게 외우고 넘어가자 어딘가에서 쓸 일이 있을수도...?
왜 이런걸까? 하면서 이유를 찾아봤는데 스택오버플로우에 영어로 설명해 놓은 사람이 있어서 대충 해석해보니. (참고링크: https://stackoverflow.com/questions/18808226/why-is-typeof-null-object)
자바스크립트 구현 초기에 객체의 유형태그는 0이었고, null은 대부분의 플레폼에서 NULL포인터로 0x00으로 표시 되었다. 그래서 결국 null은 0의 유형태그를 가지고 있었고 'object' 반환한다.
추가 하자면 추후에 이 부분에 대한 수정을 제안했지만 거절 당했다고 한다. (아마도 원래 있던 녀석 하나를 잘 못 건드렸다간 큰 일이 날지도 모르겠어서 그런게 아닌가 싶다.) 컴퓨터 언어도 언어인만큼 언어의 사회성(?) 이란게 존재 하는게 아닐까 싶다. 재밌는 부분이다.
오후엔 treeUI를 구현하는 코드를 짜는 과제였다. 말 그대로 웹상의 항목밑에 항목이 있는 것. 뭐 어렵진 않았다. 훗... 왜냐면 저번에 트위틀러 할 때 했던 것과 비슷했다. 좀 다른점은 재귀를 써서 해야 한다는 것! 뭐 그쯤이야 ... (사실 엄청 끙끙 앓으면서 풀었따)