[ MAP ]
Map : map은 key 를 이용하여 저장된 element(원소)를 빠르게 찾을 수 있도록 하는 자료구조입니다.
- map은 entry라 불리는 key-value pairs (k,v)를 저장합니다. ( 키와 값으로 이루어진 쌍 (k,v)를 저장합니다.)
- k는 key, v는 key에 상응하는 value.
- map에 저장되는 key 와 value는 어떠한 object type도 가능합니다.
ex) key: student ID (int) / value : 학생의 이름(string), 주소(string), 성적(char)과 같은 학생정보가 value가 될 수 있다.
- key의 역할
map에서 그 key와 연관된 value object를 식별하는 unique(유일한) identifier.
- map을 잘 활용하기 위한 key의 적절한 사용
value의 key를 unique index address 로 사용합니다. 즉, map에서 value의 location와 같은 역할입니다.
- map의 또다른 이름 : associative store/ associative containers
object와 연관된 key(key associated with an object)가 data structure에서 그 object의 위치를 결정하므로, map을 associative stores 또는 associated containers라고 부른다.
Entries and the Composition Pattern
위에서 언급했듯이 map은 entries(entry)라고 부르는 key-value pairs를 저장합니다.
이러한 entry는 좀더 일반적인 개념인 composition pattern의 한 예입니다.
- composition pattern 이란?
-- 다른 객체들로 구성된 단일 객체
-두 객체가 결합하여 하나의 쌍(pair)객체가 되기 때문에 "pair"는 가장 간단한 composition입니다.
이러한 개념을 코드로 구현(implementation)하기 위해, 두 개의 object를 member variable로 저장하는 class를 정의합니다. 또한 이 클래스는 두 멤버를 접근(access)하고 수정(update)하기 위한 함수(member functions)들도 제공합니다.
code fragment 9.1 : A C++ class for an entry storing a key-value pair
template <typename K, typename V> // key 오브젝트의 type을 K로, value 오브젝트의 type을 V로 템플릿
class Entry { // 클래스 이름은 Entry(pair)
public:
Entry(const K& k= K(), const V& v =V())
:_key(k), _value(v) {}
const K& key() const {return _key;}
const V& value() const {return _value; }
void setKey(const K& k) { _key = k;}
void setValue(const V& v) { _value = v;}
private:
K _key;
V _value;
}
주석으로 설명하면 주석이 너무 길어질 것 같아, 따로 코드 해석을 덧붙이겠습니다.
template <typename K, typename V>
// key 오브젝트의 type을 K로, value 오브젝트의 type을 V로 템플릿지정해 주었다는 뜻입니다.
// 즉, 클래스 정의 안에서 key의 type을 앞으로 K라고 부를 것이고, value의 type을 V라고 부를 것입니다.
// 나중에 key와 value 오브젝트에 대한 타입이 정해지면, 그때 가서 코드의 다른 한켠에 'K는 int다 V는 char이다' 와 같은 내용을 작성해주면 됩니다.
Entry(const K& k= K(), const V& v = V())
:_key(k), _value(v) {}
// 이 클래스의 constructor 입니다.
// K()는 K 오브젝트의 constructor(생성자)로 K타입의 object를 생성합니다.
// const K& k = K() : 그렇게 생성한 object를 k라는 변수에 assign합니다. 여기서 선언된 k는 K타입을 reference로 저장하는 variable입니다. 즉 값을 copy해서 저장하는 것이 아니라, '=' 오른쪽에 있는 오브젝트의 주소값을 받아 원본을 k에 저장한다는 뜻입니다. 말이 어렵네용,, 잘 와닿지 않으려나요?? K&는 K type에 대한 reference를 의미해요.
// const V& v = V() 마찬가지로 V()로 V 오브젝트를 생성하고 그 원본을 v에 저장합니다.
// const의 의미는 K와 V오브젝트를 원본으로 받긴 했지만 원본을 수정하지 않는다는 뜻입니다. constant의 약자에요
클래스 Entry의 생성자(constructor)는 이렇게 argument 두 개를 받아 k와 v에 저장하고,
클래스 내부의 member variable을 initialize(초기화; 초기 값을 지정해 주는 일)합니다.
클래스이름 ( argument list ) : member_variable1(3), member_variable2(5) ... {}와 같은 문법형식을 가졌을 때,
이러한 생성자(constructor)는 member_variable1에 3을 assign하고 member_varialbe2에는 5를 assign하여 각각을 초기화힙니다. constructor만이 가질 수 있는 특별한 코딩 문법입니다.
따라서 Entry(const K& k= K(), const V& v = V()) :_key(k), _value(v) {} 는
Entry(const K& k= K(), const V& v = V()){ _key=k ; _value=v; }와 같은 의미입니다.
const K& key() const {return _key;}
// Entry클래스에서 이 함수는 member variable에 접근(access)할 수 있도록 해주는 accessor입니다.
// member variable인 _key를 reference로 반환합니다. 즉 실제위치를 참조하여 원본을 반환한다는 뜻입니다.
// 첫 번째 const의 의미 : reference로 K type 오브젝트를 return(반환)하지만, 원본을 수정하지 않겠다는 뜻입니다.
// 두 번째 const의 의미 : 이 함수는 이 클래스의 member variable들을 수정하지 않겠다는 뜻입니다.
const V& value() const {return _value; }
// 이 함수도 accessor로 key()함수와 똑같이 이해하시면 됩니다.
cf) 제가 한글과 영어 용어를 섞어서 쓰는 이유는 두 용어 모두 음미하고 이해할 필요가 있다고 생각해서입니다. 계속 괄호를 사용하여 같이 표시하겠습니다 :)
void setKey(const K& k) { _key = k;}
// member variable을 update(값을 수정)하는 함수입니다.
// K타입 오브젝트를 reference로 받아(하지만 원본을 수정하지 않습니다 = const) k라는 variable에 저장합니다. 그리고 그 k를 member variable인 _key에 저장합니다.
// 함수명 앞의 void는 그 함수가 호출(call)되었을 때, return(반환)하는 값이 없다는 뜻입니다.
void setValue(const V& v) { _value = v;}
// 위의 setKey()와 똑같이 이해하시면 됩니다.
private: // 클래스에서 private member들을 아래 나타낼 것입니다.
K _key; // 이 Entry 클래스는 K type variable인 _key를 private member로 갖습니다.
V _value; // 이 Entry 클래스는 V type variable인 _value를 private member로 갖습니다.
'전자공학 > 자료구조(정보시스템프로그래밍)' 카테고리의 다른 글
ch7.2 Tree Traversal Algorithm (0) | 2019.06.15 |
---|---|
ch.7 Tree 자료구조 (0) | 2019.06.15 |
9.1.1 The Map ADT; 맵의 추상 데이터 타입, 추상 자료형 (0) | 2019.05.12 |