D 언어에는 다른 언어에서 해시맵(HashMap)이나 사전(Dictionary)로 알려진 연관 배열 을 제공합니다.
연관 배열 에서는 값을 찾기 위한 '키(key)' 와 그에 해당하는 '값(value)'이 일대일로 이어집니다. 예를 들어 string
을 키로 사용하고 이에 대응하는 값이 int
인 연관 배열을 아래와 같이 작성합니다.
int[string] arr;
그리고 값을 설정하거나 읽는 건 이렇게 하면 됩니다.
arr["key1"] = 10;
writeln(arr["key1"]);
찾으려는 키가 연 관배열에 있는지 먼저 체크하는 게 중요합니다. 이걸 확인하기 위해서 in
이라는 연산자를 사용합니다.
if ("key1" in arr)
writeln("있어요!");
in
연산자는 단순히 키가 있는지 없는지 확인해주는 것만 하는 게 아니라, 키에 대응하는 값의 주소를 담고 있는 포인터(참조)를 반환합니다. 그리고 만약 키가 없다면 null
포인터를 반환하여 값이 없다는 걸 알려줍니다. 위에서 확인한 in
의 용법을 응용하여, 키가 존재하는지 체크하고 키가 존재할 때 값을 바꾸는 조건부 작업을 간편히 수행할 수 있습니다.
// key1 이 존재한다면, auto 타입은 int형 값에 대한 레퍼런스로 자동 추론됩니다
if (auto val = "key1" in arr)
*val = 20;
만약 없는 키를 연관 배열에서 값을 찾기 위해 사용한다면 RangeError
의 원인이 되며, 이 에러로 인해 프로그램 동작이 종료됩니다. 따라서 연관 배열에 값이 없을 경우를 고려해 안전하게 값을 확인하려면 get(키, 키가 없을 때 기본값)
함수를 사용하는 게 좋습니다.
연관 배열은 일반 배열과 마찬가지로 .length
프로퍼티를 가지고 있어 몇 개의 키가 들어있는지 확인할 수 있습니다. 또한 .remove(key)
내부 함수를 통해 키와 키에 해당하는 값을 연관 배열에서 제거할 수 있습니다. .byKey
와 .byValue
라는 프로퍼티도 있는데, 직접 소개하기 보다는 이어질 실습을 통해 직접 확인하시기 바랍니다.