잔뿌리 호기심은 메인 주제에서 뻗어나온 개인적인 궁금증을 다룹니다.
리터럴이란 무엇일까?
이전부터 여러가지 공부를 해오며 어렵지 않게 접하던 단어가 있습니다.
네, 맞습니다. 이 글의 제목 리터럴 (Literal) 입니다.
개인적으로 느낀 점은 공부하며 단어의 의미를 정확히 파악하는 것은 매우 중요한 요소라는 것입니다.
단어의 의미를 정확히 파악하지 못한다면 해당 단어에서 파생되는 새로운 개념들 그리고 새로운 단어들의 의미또한 파악하기 어려워집니다.
제가 그것을 가장 크게 체감하고 제 나름대로의 적절한 정리와 비유를 마친 키워드가 바로 리터럴 이기에 이 글을 작성하며 생각을 정리해보고자 합니다.
LITERAL
Why ? [ 왜 이 글을 쓰게 되었는가 ]
저는 여러 프로젝트를 진행해보며 기능이 추가될 때 마다 손 쓸수 없이 복잡해져가는 제 코드를 바라보며 좋은 코드의 필요성을 체감했습니다. 좋은 코드를 위한 공부를 하다보니 자연스레 여러가지 단어들을 접하게 되더라구요. 이해가 바로 되는 단어가 있는 반면, ‘그래서 도대체 그게 정확히 무슨뜻인데?’ 라는 의문이 드는 단어도 있었습니다.
그 중 하나가 바로 오늘의 주제 리터럴이였습니다.
이해하지 못한 단어로부터 파생된 불완전함은 다른 개념들까지 영향을 미치기에, 저는 평소엔 그런 미심쩍은 부분이 있다면 파고들어 이해를 해야 직성이 풀리더라구요.
리터럴이라는 단어의 의미를 잘 알지 못하더라도 개발하는데 큰 어려움은 없습니다. 어떻게 보면 OOP 4원칙이나 SOLID 원칙과 같은 요소들을 모르더라도 단순한 기능을 개발하는데 치명적인 어려움을 겪진 않습니다. 물론 더 나은 코드를 작성하는데에는 어려움을 겪겠지만요. 리터럴같은 사소한 궁금증을 알아가고 정리하는 이 과정이 저를 조금은 더 나은 개발자로 만들어주리라 믿습니다.
Literal
공부를 하면서도 리터럴이라는 단어 그 자체를 접하는 경우는 그렇게 많지 않습니다. 실제로는 객체 리터럴, 함수 리터럴등을 더 자주 많이 접하게 되죠. 실제로 제가 불편하고 답답함을 느꼈던 부분도 객체 리터럴 때문이었습니다.
밑의 두 문장에서 저의 궁금증은 시작됩니다.
Literal : 컴퓨터 과학 분야에서 리터럴(literal)이란 소스 코드의 고정된 값을 나타내는 표기법이다. - 위키백과
자바스크립트는 prototype 기반 객체지향 언어로서 다양한 객체생성 방법을 지원한다…
그 중에는 객체 리터럴 방식이 있고 객체 리터럴은 중괄호로 둘러싸여 다음과 같이 구성됩니다.
1 2 3 4 const student = { name : 'CSKim', age: 20 }
??? : 좋아 리터럴은 고정된 값을 나타내는거라고? 그럼 객체 리터럴은 객체의 고정된 값…이라고? 객체면 객체지 객체의 고정된 값은 뭐야? 그냥 객체라고 부르면 안되는거야?🧐
이러한 고민은 저를 그렇다면 리터럴은 상수(Constant) 와 다른점이 뭘까?라는 질문으로 안내했습니다.
Literal & Constant
Constant : 변하지 않는 수
고정된 값(Literal) 과 변하지 않는 값(Constant)의 차이가 무엇일지 고민하는 과정에서 저는 리터럴이라는 단어의 의미를 이해할 실마리를 찾을 수 있었습니다.
1
2
3
4
const student = {
name : 'CSKim',
age: 20
}
앞선 예시 코드에서 student 는 const 키워드가 앞에 붙어 있습니다. 네 맞습니다. Constant 의 약자 const 입니다. 즉, student는 변하지 않는 수. 상수로 선언된 것이죠.
하지만 우리는 객체는 불변이 아니며 객체 내부의 값이 변할 수 있다는 점을 알고 있습니다.
모순적이지 않나요? 상수는 ‘변하지 않는 수’ 인데, 왜 const 키워드로 선언된 student 객체는 변할 수 있는걸까요?
메모리주소
그 이유는 알고계셨겠지만, 메모리 주소에 있습니다. 상수로 선언된 값은 메모리주소를 참조하게 되고, 참조하고있는 메모리 주소를 변경할 수 없습니다. 즉, ‘변하지 않는 수’ 라는 키워드는 해당 변수가 참조하고 있는 메모리의 주소가 변하지 않는다는 뜻입니다.
현재 상수 student 는 객체를 참조하고 있으며, 객체는 가변성(Mutable)을 지닙니다. 따라서 객체 자체를 변경하는 것은 불가능하나, 객체의 내부상태나 배열은 변경할 수 있습니다.
반대로 만약 student 가 5 라는 숫자를 참조하고 있었다면, 문자열이나 숫자같은 원시타입은 불변성(Immutable)을 지닙니다. 따라서 그 값을 변경할 수 없다는 뜻 입니다.
그래서 리터럴은 뭔데?
그래 상수가 뭔지는 알겠어. 그래서 리터럴은 뭔데?
앞선 위키백과 정의의 마지막에 정답이 이미 나와있었습니다. 리터럴은 ‘고정된 값’ 이 아니라, 고정된 값을 나타내는 ‘표기법’ 이다. 리터럴은 선언문의 우항에 작성되는 값을 의미합니다. 앞선 student 의 경우엔 객체가 될 것이고, 숫자나 문자열이 될 수도 있습니다.
즉, 5 는 숫자 리터럴, ‘hello’ 는 문자열 리터럴, { a : 1 } 는 객체 리터럴인 것입니다.
여기서 의문이 드실 수 있습니다. ( 제가 그랬거든요 ) 숫자면 숫자지 저게 왜 숫자 리터럴이야?
우리가 사용하는 5 라는 아라비아 숫자는 컴퓨터는 이해할 수 없기 때문입니다. 그렇다고 저희가 기계어로 5를 작성할수도 없는 노릇이구요.
그렇기 때문에 사용되는 것이 바로 리터럴 표기법인 것입니다. 5라는 숫자를 기입하면 컴퓨터는 메모리에 연산에 사용할 수 있는 5라는 값을 저장하고 사용하게 됩니다.
즉, ‘리터럴’ 이라는 단어는 저희가 소스코드에 작성하는 숫자 5나 ‘hello’ 와 같은 문자들을 지칭하는 단어이고 컴퓨터는 리터럴이 참조하는 메모리 주소에서 값을 가져와 연산에 사용한다는 뜻 입니다.
리터럴은 수표다
저는 딱 여기까지 알게 되었을 때 이해가 갈듯 말듯 아리송한 느낌이 강해 제 자의적인 해석을 통해 비유를 찾아 오랫동안 기억하고자 했습니다.
고민끝에 나온 결론이 바로 ‘리터럴은 수표다’ 입니다.
수표는 현금과 다르게 그 자체로 가치를 지니지 않습니다. 은행에 가서 환전을 해야 비로소 그 가치를 지니게 되죠. 저는 이것이 리터럴이 사용되는 방식과 매우 유사하다고 생각했습니다.
리터럴(수표) 는 그 자체로 의미(가치)를 지니진 않으나, 참조 메모리 주소에서 값을 가져오면(은행에 가서 환전) 비로소 연산에 사용할 수 있다(가치를 지니게 된다).
저는 이 비유를 완성하는 것으로 조금이나마 리터럴에 대한 이해를 마무리할 수 있었습니다.
Outro
나름대로 궁금증의 발단과 해결 과정을 담아보려 노력했으나, 충분히 전달이 되었을 지 모르겠습니다. 머릿속으로 이해한 바를 글로서 정리하고자 작성한 글이지만, 혹시나 읽고 계실 저와 같은 궁금증을 가지신 분들께 조금이라도 이해에 도움이 되었다면 참 좋겠습니다.
