5. 값 시스템: '달빛 약속'이 다루는 데이터들
우리가 일상생활에서 숫자, 글자, 목록 등 다양한 종류의 정보를 다루듯이, 프로그래밍 언어도 여러 형태의 데이터를 처리합니다. '달빛 약속' 역시 마찬가지이며, 이번 장에서는 '달빛 약속'이 어떤 종류의 데이터를 다루고, 이 데이터들이 내부적으로 어떻게 표현되는지 **값 시스템(Value System)**을 통해 알아보겠습니다.
값 시스템의 계층 구조
'달빛 약속'의 모든 값은 /core/value/base.ts
에 정의된 ValueType
이라는 최상위 추상 클래스를 상속받습니다. 이 ValueType
은 모든 '달빛 약속' 값이 가져야 할 공통적인 특성(예: friendlyName
, toPrint()
메소드)을 정의합니다.
ValueType
아래에는 크게 두 가지 추상 클래스가 존재합니다.
PrimitiveValue
: 숫자, 문자열, 불리언과 같이 더 이상 쪼갤 수 없는 원시적인 값을 나타냅니다. 실제 JavaScript/TypeScript의 원시 값을 내부적으로 래핑합니다.ObjectValue
: 목록, 함수 등 객체 형태의 값을 나타냅니다. 이들은 내부적으로 더 복잡한 구조를 가질 수 있습니다.
이러한 계층 구조를 통해 '달빛 약속'의 모든 값은 일관된 방식으로 처리될 수 있습니다.
'달빛 약속'의 주요 값 타입
1. 원시 값 (Primitive Values)
/core/value/primitive.ts
에 정의되어 있으며, PrimitiveValue
를 상속받습니다.
NumberValue
: '달빛 약속'의 숫자를 나타냅니다. (예:10
,3.14
)StringValue
: '달빛 약속'의 문자열을 나타냅니다. (예:"안녕하세요"
,"달빛"
)BooleanValue
: '달빛 약속'의 참/거짓 값을 나타냅니다. (예:참
,거짓
)
2. 목록 (ListValue)
/core/value/list.ts
에 정의된 ListValue
는 여러 개의 값을 순서대로 담을 수 있는 컬렉션입니다. 다른 언어의 배열(Array)이나 리스트(List)와 유사합니다.
주목할 점: ListValue
는 /core/value/indexed.ts
에 정의된 IndexedValue
를 상속받습니다. 이는 '달빛 약속'의 목록이 단순히 순서 있는 컬렉션일 뿐만 아니라, 내부적으로 키-값 쌍을 관리하는 Map
기반의 인덱스 접근(getItem
, setItem
)이 가능한 객체처럼 동작한다는 것을 의미합니다.
목록 = [1, 2, 3]
보여주기(목록[0]) # 1 출력
3. 함수 (FunctionObject)
/core/value/function.ts
에 정의된 FunctionObject
는 '달빛 약속' 코드 내에서 정의된 함수를 나타내는 값입니다. ObjectValue
를 상속받으며, 함수도 다른 데이터처럼 변수에 할당하거나 함수의 인자로 전달할 수 있습니다.
FunctionObject
는 함수 본문(Block
)과 함수가 선언된 스코프(declaredScope
)를 포함하며, run
메소드를 통해 실제 함수 본문을 실행합니다.
4. 인덱스 접근 가능한 값 (IndexedValue)
/core/value/indexed.ts
에 정의된 IndexedValue
는 키(문자열 또는 숫자)를 통해 값에 접근할 수 있는 객체를 나타냅니다. ListValue
가 이를 상속받는 것처럼, 향후 '달빛 약속'에 사전(Dictionary)이나 객체와 같은 데이터 타입이 추가된다면 IndexedValue
를 상속받아 구현될 수 있습니다.