본문 바로가기

전자공학/자료구조(정보시스템프로그래밍)

9.1 Map : 맵과 맵의 엔트리, 자료구조 맵 맛보기

[ 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로 갖습니다.