티스토리 뷰

놀이공원이나 아울렛과 같이 사람이 많이 방문하는 곳은 주차장도 굉장히 크고 주차 기둥마다 B-1, C-32 와 비슷한 형태의 번호가 적혀 있습니다. 너무 넓어서 차를 어디다가 뒀는지 헷갈릴 수 있기 때문이죠. 특히 차량 리모컨이 없던 시절에는 차를 찾아 넓은 주차장을 헤매는 경우도 종종 있었지만 현재는 대부분 리모컨 버튼을 누르면 쉽게 찾을 수 있지요.

 

그런데 만약 리모컨 하나로 2대 이상의 서로 다른 차의 문을 열 수 있다면 어떨까요? 어떤 사람이 리모컨 버튼을 눌렀는데 근처에 있던 5대의 차가 모두 문이 열려버린다면... 이런 일이 있어서는 안되겠죠? 다행히 리모컨은 자동차 열쇠(key) 와 같은 역할을 하며 딱 1대의 차만 열 수 있도록 되어 있습니다.

 

이번에 공부할 자료구조인 사전(Dictionary)도 이와 같습니다. 사전은 key 와 value 가 쌍으로 이루어져 있습니다. 영어를 공부할 때 영한 사전을 보면 영어 단어가 있고 그 단어의 뜻이 설명 되어 있지요. 이 때 영어 단어를 key, 단어의 뜻을 value 라고 생각하시면 됩니다.

 

사전은 중괄호로 둘러싸서 정의할 수 있으며, key 와 value 는 콜론(:) 으로 구분짓습니다. 2개 이상의 데이터는 리스트와 마찬가지로 콤마(,)로 구분하시면 됩니다.

{ key1 : value1, key2 : value2, ... }

이 때 key 들은 중복값을 허용하지 않는 유일한 값으로 설정해야 합니다. 자동차 리모컨처럼 말이죠.

 

사전은 처음 접하면 개념 이해가 조금 어려울 수 있으니, 코드를 보면서 설명하도록 하겠습니다. 예제 상황은 멤버들이 목욕탕에 가서 각자 사물함 열쇠(key) 를 받고 사물함을 이용하는 것입니다.

 

먼저 사전 형태의 사물함인 cabinet 을 정의하고 유재석씨에게는 3번 사물함 열쇠를, 김태호씨에게는 100번 사물함 열쇠를 주도록 하겠습니다.

cabinet = {3: "유재석", 100: "김태호"}

 

각 사물함이 누구 것인지를 확인해볼까요? 이 때는 대괄호 속에 key 값을 넣음으로써 key 에 해당하는 value 를 가져올 수 있습니다.

print(cabinet[3]) # 유재석 -> key 3 에 해당하는 value
print(cabinet[100]) # 김태호 -> key 100 에 해당하는 value

또는 대괄호가 아닌 get() 을 이용하는 방법도 있어요.

print(cabinet.get(3)) # 유재석 -> key 3 에 해당하는 value

 

그런데 대괄호와 get() 은 완전히 같지는 않습니다. 대괄호를 이용해서 만약 정의되지 않은 key 를 전달하면 에러가 발생하고 프로그램이 바로 종료가 되어요. 아직 사용하고 있지 않은 5번 사물함 열쇠로 시도해볼게요.

print(cabinet[5]) # key 가 5 인 값이 없을 땐 에러 발생 후 프로그램 종료 (hi 출력 안됨)
print("hi")

같은 동작을 get() 을 이용해서 해보겠습니다. 이 때는 만약 정의되지 않은 key 를 전달하더라도 에러가 발생하지는 않고 None 을 반환해준답니다. 그리고 프로그램은 계속 실행되지요.

print(cabinet.get(5)) # key 가 5 인 값이 없을 땐 None 반환 후 계속 진행 (hi 출력됨)
print("hi")

get() 은 이렇게도 활용할 수 있어요. 5번 사물함은 아직 사용되고 있지 않으니 사람 이름 대신 "사용 가능" 이라는 기본값을 설정할 수가 있습니다. 만약 나중에 누군가 5번 열쇠를 받게 되면 그 사람의 이름이 출력되겠지만, 그 전에는 "사용 가능" 으로 나오게 됩니다.

print(cabinet.get(5, "사용 가능")) # key 에 해당하는 값이 없는 경우 기본 값을 사용

사물함이 사용중인지는 in 을 통해서 확인할 수 있습니다. key 값이 사전 자료형에 정의되어 있는지 여부를 알아보는 것이죠.

# 사전 자료형에 값이 있는지 여부 확인
print(3 in cabinet)  # True
print(5 in cabinet)  # False

key 는 정수형이 아닌 문자열도 가능합니다.

# key 는 정수형이 아닌 문자열도 가능
cabinet = {"A-3": "유재석", "B-100": "김태호"}
print(cabinet["A-3"]) # 유재석
print(cabinet["B-100"]) # 김태호

시간이 지난 후, 만약 유재석씨가 목욕을 마치고 집에 가려는데 김종국씨가 목욕탕에 와서 유재석씨가 쓰던 "A-3" 사물함 열쇠를 받으면 어떻게 될까요? 이제 "A-3" 사물함은 김종국씨가 사용하게 되겠지요. 이 때는 대괄호를 이용해서 새로운 값을 업데이트 할 수 있습니다. 조세호씨도 함께 왔다고 가정해볼까요? 조세호씨는 아직 아무도 쓰지 않았던 "C-20" 사물함 열쇠를 받습니다. 김종국씨 때와 업데이트와 마찬가지로 대괄호를 이용하여 값을 설정하게 되지만, 이 때는 업데이트가 아니라 새로운 key, value 를 추가하는 동작이 됩니다.

# 업데이트 또는 추가
print(cabinet) # {'A-3': '유재석', 'B-100': '김태호'}
cabinet["A-3"] = "김종국" # key 에 해당하는 값이 있는 경우 업데이트
cabinet["C-20"] = "조세호" # key 에 해당하는 값이 없는 경우 신규 추가
print(cabinet) # {'A-3': '김종국', 'B-100': '김태호', 'C-20': '조세호'}

이제 김종국씨가 목욕을 마치고 사물함 열쇠를 반납해보도록 하겠습니다. 사전 자료형에서는 del 을 이용하여 key 값에 해당하는 key, value 데이터를 삭제할 수 있습니다.

# 삭제
del cabinet["A-3"] # key "A-3" 에 해당하는 데이터 삭제
print(cabinet) # {'B-100': '김태호', 'C-20': '조세호'}

벌써 날이 어두워져서 목욕탕 문을 닫을 때가 됐네요. 사장님은 사용중인 사물함이 어떤 게 있는지 확인하고 싶어합니다. 이 때는 keys() 를 이용하여 사전 내의 모든 key 들을 확인할 수 있습니다.

# key 들만 출력
print(cabinet.keys()) # dict_keys(['B-100', 'C-20'])

손님들은 누가 있는지 볼까요? values() 를 통해 사전 내의 모든 value 들을 확인할 수 있습니다.

# value 들만 출력
print(cabinet.values()) # dict_values(['김태호', '조세호'])

어떤 사물함을 어떤 손님이 쓰는지를 확인하려면 둘을 동시에 봐야겠네요. items() 를 이용하면 key, value 쌍으로 데이터를 확인할 수 있습니다.

# key, value 쌍으로 출력
print(cabinet.items()) # dict_items([('B-100', '김태호'), ('C-20', '조세호')])

이제 손님들에게 목욕탕 종료 안내를 하고 손님들이 가신 뒤에 문을 닫습니다. clear() 를 통해서 사전 내의 모든 데이터를 삭제해볼게요.

# 전체 삭제
cabinet.clear()
print(cabinet) # {}

 

어떠신가요?

목욕탕 사물함을 예제로 설명을 드렸는데 아직은 개념이 크게 와닿지는 않지요? 사전 자료형을 어떤 경우에 사용하는지, 어떤 식으로 활용하는지에 대해서는 뒷부분 (표준 입출력) 에서 배우도록 하겠습니다. 지금은 key, value 로 구성이 된다는 점, 어떻게 추가, 삭제 및 업데이트 하는지에 대한 문법, 그리고 items() 를 통해서 모든 데이터를 확인할 수 있다는 정도만 알아두시면 좋겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함