4.2 자료구조


세 가지 자료구조 중 두 가지를 이미 학습하였다. 이 절에서는 프로그래밍하면서 사용하게 될 전문용어가 소개될 것이다. 구조화된 데이터를 위한 새로운 툴킷과, 사전 구조에 대해서도 학습하게 된다.

학습하게 될 세 가지 자료구조는 다양하고 매우 복잡한 추상화를 다루기에 충분하다. 여기서 학습하지 않는 다른 자료구조들도 존재한다. 그 자료구조들은 연산 집중적인 계산을 수행하거나, 좋은 효율성을 얻으려 하거나, 컴퓨터의 메모리를 적게 필요로 하려 할 때 종종 필요로 하는 것이다. 이러한 것은 컴퓨팅의 고급 연구를 위해서는 중요한 문제이지만, 여기서는 중요한 목적이 아니다.

 

4.2.1 자료형

추상화의 속성 값은 컴퓨터에서 숫자나 문자로 표현될 수 있다. 그 숫자는 양수나, 음수 그리고 정수(10, 0, -250, 2750) 또는 소수점이 있는 숫자(2.5, -10.333, 1245.678)가 될 수 있다. 숫자들은 일반적으로 온도, 범죄 횟수, 범죄율, 지진의 진도 같은 양을 나타낸다. 각각의 문자들은 일반적으로 책 제목, 사람 이름, 도시 이름, 지진이 발생하는 주변 지역 이름 등과 같이 속성을 나타내는 문자열을 구성하는 데 사용된다.

속성 값을 나타내는 데 사용되는 정보의 종류를 “자료형(type)”이라고 한다. 이미 앞으로 사용할 기본 자료형들을 학습한 바 있다. 표 4-1은 기본적인 자료형에 대하여 설명한 것이다. int정수(integer)라는 단어의 축양형이다. 자료형float부동 소수점 수(floating point number)의 축약형이며, 소수점 수이다. 연속된 문자들을 string이라고 한다. 어떤 기호들이 문자열의 일부인지 명확히 하기 위해 문자열은 따옴표 안에 넣는다.


(셰익스피어 연극의 제목은 “맥베스(Macbeth)” 또는 ‘맥베스(Macbeth)’로 기록 될 것이다). 대부분의 문자와 문자열은 알파벳으로 되어 있지만 인쇄 가능한 기호는 어떤 것이든 문자가 될 수 있거나 문자열에 포함될 수 있다. 그러므로 대부분의 프로그래밍 언어들은 문자열을 구분하기 위해 반드시 이중 인용 부호(“”)나 단일 인용 부호(‘’)를 사용한다. 각각의 문자든 문자열이든 시작과 끝을 나타내기 위하여 같은 종류의 따옴표를 사용한다. 마지막 자료형은 참과 거짓의 논리 값을 갖는다. 이 자료형은 19세기에 기호 논리학과 부울 대수학의 학문으로 유명한 수학자 George Boole을 기념하여 불리언 자료형(Boolean type)으로 이름 지어 졌다.

 

표 4-1. 기본적인 자료형

자료자료형설명
정수int양과 음의 모든 정수

2353, 0, – 220, 6

실수float

양과 음의 소수점 수

2.1415, -4.9, 0.123

문자열string

“나”로 구분된 연속된 기호

‘virginia’, ”alpha9”, ’360’, ”2353”, ”http://www.cs.vt.edu”

논리boolean

boolean 논리값

true, false

 

위에서 설명한 자료형들(int, float, string, boolean)은 컴퓨터가 직접적으로 다룰 수 있는 데이터 종류이기 때문에 기본적인 자료형들이다. 모든 데이터는 궁극적으로 이러한 자료형으로 표현되어야 한다. 일반적으로 특정한 자료형에 대해서 특정한 연산만 수행할 수 있다. 예를 들면, 컴퓨터는 숫자에 대해서 수학적인 연산을 수행할 수 있지만 수학적인 연산을 문자열에 대해선 수행할 수 없다. 사람은 “16”(문자열)과 “30”(문자열)을 더하라는 요청을 받고 “46”이라고 답할 수 있지만 컴퓨터는 이것이 의미하는 것을 이해할 수 없을 것이다. 컴퓨터가 비슷한 일을 수행하려면 컴퓨터 프로그래밍에서는 명시적으로 문자열 “16”을 숫자 16 으로, 문자열 “30” 을 숫자 30 으로 변환하라는 명령을 해야 하고, 그 후에 16+30을 계산하여야 한다. 다시 말해, 사람들은 모호성과 문맥(context)을 이해할 수 있는 반면에 컴퓨터는 이해할 수 없다는 것이다.

 

 

Multiple Choice 다음 자료형과 자료형의 표현 예시가 잘못 연결 된 것은?




 

Multiple Choice 리스트는 {1, 3, ‘number’, 4, 5}와 같이 다른 자료형으로 구성될 수 있다.


 

Multiple Choice 리스트 {1, 3, 4}에 2를 추가하면 리스트 {1, 3, 4, 2}이 된다.


 

Multiple Choice temperatures = {45, 33, 20, 11, -7, 15, 3}에서 20은 세 번째 요소이며 position은 3이다.


 

Multiple Choice
magnitudes = {2.1, 1.1, 3.7, 4.2, 2.0, 1.7}
temp = magnitudes{4}
위의 문장을 실행하면 temp값은 4.2이다.




4.2.2 Lists

이미 앞에서 빅 데이터 스트림(big data streams)을 다루는 리스트에 대해서 설명한 바 있다.

리스트는 일반적으로 다른 프로그래밍 언어에서는 배열(array)이라고도 한다. 리스트의 특징은 다음과 같다.

  • 구성 원소 : 리스트의 모든 원소는 같은 자료형이다. 개념적으로 동일하다.
  • 구성 : 순서가 있는 원소들
  • 접근 : 각 for-each 반복 사용하면서 또는 위치에 따라서 한 번에 하나씩 접근한다.
  • 생성 : 리스트의 마지막에 붙여 넣기

리스트의 개념적 측면에서는 리스트의 모든 요소들이 동일한 구조와 의미를 지닌다는 것을 의미한다. 예를 들어, 예측된 기온들의 리스트는 모든 요소들이 int 자료형이고 모두 화씨 단위의 온도들이다. 지진 데이터 스트림(data stream)의 크기들은 모두 float 자료형이고 모두 리히터(Richter) 단위의 측정 값이다. 이런 이유에서 리스트는 또한 동종(a homogeneous)의 자료구조라고도 부른다.

 

리스트의 구조 측면에서는 요소들이 순차적으로 정렬된 것을 의미한다(리스트의 첫 번째 요소, 두 번째 요소 ... ). 값의 순서가 어떤 중요도를 갖고 있을 때 리스트는 특별히 유용한 자료구조이다. 예를 들어 , 5일 동안의 날씨 예보에서 리스트의 첫 번째 원소는 내일의 예보를 나타내고, 두 번째 원소는 내일 모레 예보를 나타내면서 5일 동안의 날씨 예보를 나타낸다. 이 경우에 리스트 요소들의 순서는 미래의 연속적인 날들과 대응한다. 범죄 데이터에서는 어떤 도시의 매년 범죄율을 나타내는 것을 원할 수 있다. 리스트의 연속적인 각각의 원소들은 일정 기간 안에서 다음 해의 데이터를 나타내기 때문에, 리스트는 데이터를 구성하는 자연스러운 방법이다. 이 두 가지 예시에서 정렬된 리스트는 특정 기간 안에서 특정 순서에 대응한다(연속적인 날이나 연속적인 해). 일반적인 다른 순서들은 알파벳, 높이, 길이, 무게, 비용이나 일련의 순서를 갖는 데이터이다.

 

리스트에 대한 접근은 리스트의 연속적인 각각의 요소에 for-each 반복문을 사용하면서 한 번에 한 개씩 접근할 수 있어서 효율적인 프로그램을 작성하는데 유용하다. 이러한 반복의 형태를 사용하면서 리스트의 각 원소들은 현재의 반복에서 사용될 수 있는 원소로써 차례로 하나씩 사용할 수 있다. 때로는 리스트의 특정한 요소에 바로 접근하는 것이 필요하다. 예를 들어, 리스트의 첫 번째 요소가 필요할 수 있다. 리스트는 정렬되어있기 때문에 리스트의 각 요소들은 리스트 안의 고유 위치에 의해 식별 될 수 있다. 많은 프로그래밍 언어에서처럼 리스트의 첫 번째 원소는 위치가 0이고, 두 번째 원소의 위치는 1이다. 리스트가 n 개의 원소를 가지고 있다면 마지막 원소의 위치는 n-1이다.

 

리스트는 도식적으로 아래의 그림 4-1과 같이 나타낼 수 있다. 이 그림에서 묘사된 리스트는 각각이 간단한 정수(int)인 7개의 요소를 가지고 있다. 리스트의 첫 번째 값은 45이며, 위치는 0이다. 리스트의 두 번째 값은 33이며, 위치는 1이다.


../_images/Abstraction-List-Representation.png
그림 4-1. 리스트의 그림 표현

 

아래의 예시와 같이 리스트는 텍스트로 표현할 수 있다. 텍스트로 표현된 첫 번째 리스트는 위의 그림으로 표현된 리스트와 같다. 텍스트 표현에서, 값은 쉼표로 구분하고 전체 리스트는 대괄호로 구분한다. 첫 번째 경우에서, 리스트는 temperature속성 값으로 설정되어 있다. 다른 예제 리스트들은 리스트 안의 값들이 다른 자료형 일 수 있다는 것을 보여주는 예시이다.

magnitudes의 속성 값은 리스트의 모든 요소들이 소수점 수(float형)로 설정되어 있는 반면에 cities의 속성 값은 모든 요소들이 문자(string형)로 설정되어 있다. 이러한 예제들은 리스트가 같은 자료형의 요소들을 임의의 개수로 포함할 수 있고, 하나의 속성이 값으로 하나의 리스트를 가질 수 있다는 것을 보여준다.

temperatures = [45, 33, 20, 11, -7, 15, 3]
magnitudes = [2.1, 1.1, 3.7, 4.2, 2.0, 1.7 ]
cities = [ 'Blacksburg, VA', 'New York, NY', 'Seattle, WA' ]

 

이미 for each 반복문을 사용하여 리스트의 요소들에 접근하는 법을 학습하였지만, 위치에 따라서 리스트의 각 요소에 접근하는 것 또한 가능하다. 이러한 접근 형태는 위와 같은 텍스트 표현을 계속해서 아래의 예시에서 보여준다. 리스트 이름[위치]표기법은 리스트에서 요소에 있는 값 또는 위치를 나타내는데 사용된다. 첫 번째 예시는 속성 tomorrowtemperaturefuture속성의 값을 온도 리스트의 마지막 요소로 설정하는 것을 보여준다. 다른 예시들도 이와 같다.

tomorrow = temperatures[0]
future = temperatures[6]
biggest = magnitude[3]
big_city_name = cities[2]

 

리스트의 추가 측면에서는 리스트를 생성할 때(예를 들어, 반복의 패턴 변환에서), 리스트의 마지막에 새로운 요소를 추가함으로써 구성된다. 비어있는 리스트에서 시작하면 추가되는 첫 번째 값은 리스트의 첫 번째 요소가 되며, 추가되는 두 번째 값은 리스트의 두 번째 요소가 된다. 리스트에 있는 요소의 개수는 제한이 없다.

리스트의 요소들에 접근하는 다른 방법들, 반복의 다른 방법들, 리스트에 요소를 추가하는 다른 방법들이 있다는 것을 알아야 한다. 여기서는 이런 다른 방법들에 대해서 학습하지 않는다. 이러한 다른 방법들은 어떠한 기본적인 새로운 능력도 창출되지 않는다.

 

4.2.3 사전

사전(Dictionary)은 추상화의 값을 구성하기 위한 또 다른 자료구조이다.

사전의 특성들 :

  • 개념: 요소들은 같은 자료형일 필요가 없고, 개념적으로 다를 수 있다.
  • 구조: 키-값 쌍들의 순서가 없는 집합
  • 접근: 주어진 키에 대응하는 값 반환
  • 추가: 새로운 키-값 쌍을 추가

 

개념 측면에서는 요소들이 자료형이나 의미가 서로 다를 수 있다는 것을 의미한다. 예를 들어, 작가와 책의 제목은 둘 다 string 자료형(순서가 있는 문자들)의 값으로 표현될 수 있지만, 이 문자열들은 아주 다른 것들을 의미한다. 반면에 책의 가격은 float 자료형(소수점 수)의 값으로 표현할 수 있고 책의 페이지 수는 int 자료형(정수)의 값으로 표현할 수 있다. 이 경우에 두 개의 구조(자료형)와 책 속성 값의 의미는 다르다.

 

구조 측면에서 사전은 값을 키와 대응시켜서 구성되는 것을 의미한다. 이러한 자료구조는 언어 사전에서 각각 “단어”(키)와 “정의”(값)을 갖는 것과 비슷하기 때문에 dictionary이라고 부른다. “단어”와 “정의”는 함께 묶여있다. 이 경우에서, 키는 보통 문자열이 될 것이다(그렇지만 다른 것도 될 수 있다.). 부분은 어떤 자료형도 될 수 있다.

 

또한 구조 측면에서 사전은 순서가 없다. 즉, 어떤 순서로 키/값 쌍들이 주어져도 상관없다. 언어 사전에서 단어(키)들이 정렬된 순서로 나타나는 것을 생각하면 사전이 순서가 없다는 개념은 이상하게 보일 수 있다. 하지만 이러한 순서는 오로지 사람에게만 편리하다. 예를 들어, “zebra(얼룩말)”이라는 단어의 정의는 영어사전의 마지막 부분 가까운 곳에서 발견될 것이지만, “middle(중간)”이라는 단어의 정의는 영어사전의 중간 부분 가까운 곳에서 발견될 것이다.

 

하지만, 언어 사전은 다른 방식으로 구성할 수 있다. 예를 들면, 크로스워드 퍼즐 선수는 단어 길이에 따라서 정렬된 사전을 좋아할 것이다(한 글자인 모든 단어들이 처음에 오고, 두 글자인 모든 단어들이 그 다음에 온다). 중요한 것은 두 경우에서 특정 단어의 정의는 동일하다는 것이다.

 

사전은 도식적으로 아래의 그림에서 보여 지는 것과 같이 나타낼 수 있다. 이 그림은 다섯 개의 속성: 책 제목, 작가, 가격, 페이지 수, 단행본 가능여부를 가지고 있는 사전을 나타낸다. 각 열의 맨 위는 이며, 그 아래는 에 해당하는 값이다. 각각의 는 물론 사전에서 하나뿐이어야 하고, 각각의 키는 정확한 하나의 값을 갖는다.


../_images/Abstraction-Dictionary-Representation.png
그림 4-2. 사전의 도식적인 표현

 

사전은 Blockly로 다음의 예에서와 같이 만들어 질 수 있다. 사전 메뉴(Dicts라고 표시된)는 블록에 create dict with 를 포함할 수 있다. default로 이 블록은 하나의 키/값 쌍의 사전을 만든다. 키/값 쌍을 추가하기 위해서는 create dict with 블록 위의 edit 아이콘(파란 상자 안에 하얀 별)을 클릭한다. 사전의 키/값 쌍을 생성하기 위해서 키/값 블록의 추가 창(아래 그림 참조)은 Create Dictionary 블록 내부로 끌어올 수 있다. 이 단계는 키/값 쌍을 원하는 만큼 생성하기 위해 반복 될 수 있다. 완료되면, edit 아이콘을 다시 눌러라.


../_images/Abstraction-Blockly-Dictionary-Create.png
그림 4-3. Blockly로 사전 만들기

 

사전의 키/값은 다음의 그림에서 보여 지는 것과 같이 정의될 수 있다. 각각의 키 영역은 원하는 키 이름으로 수정될 수 있다. 메뉴나 속성 메뉴의 아이콘은 키와 관련된 값을 정의하기 위해 각각의 키 위치에 삽입될 수 있다. 아래의 그림에서의, 사전은 작가 키가 ‘J.K.Rowlings’라는 값을 갖고, 가격 키는 7.48을 값으로 갖으며, 페이지 수 키는 320을 값으로 갖는다.


../_images/Abstraction-Blockly-Dictionary-Initialized.png
그림 4-4. Blockly 사전에서 키/값 쌍의 정의


또한 사전의 쌍은 ‘키‘: 값 과 같은 문자 형식으로 쓰여 질 수 있다. 책의 간단한 예에서, ‘page count’: 320 쌍은 320페이지로 주어진 책을 표현하기 위해서 int 값 320 은 ‘페이지 수’ 키와 관련이 있다는 것을 의미할 것이다. ‘가격’: 7.48 쌍은 책 가격을 표현하기 위한 float 타입(type) 7.48이 ‘가격’ 키와 관련이 있다는 것을 의미할 것이다. ‘작가’ 키는 책의 작가를 의미하기 위한 string 타입(type)의 값과 관련이 있을 것이다.

 

텍스트 표현에서, 키: 값 쌍 콤마로 분리된 몇 개의 숫자로 구성된 사전:

aBook={'page count':320,'price':7.48,'author':'J.K. Rowlings',
'title':'Harry Potter #1','paperback':True}

 

중괄호는 사전의 시작과 끝을 구분한다. 이 경우 “aBook” 속성에 할당된 값은 사전이다.
앞서 언급한 바와 같이, 키:값 쌍은 어떤 순서로 쓰던 그 의미의 변화가 없기 때문에 사전은 정렬되어 있지 않다. 예를 들어, 위에서 설명한 “aBook”은 아래와 같이 쓰여 질 수 있다.

aBook={'page count':320,'price':7.48,'author':'J.K. Rowlings',
‘paperback’:True, 'title':'Harry Potter #1'}

 

또한 사전의 순서가 없다는 성질은 이 두 개의 문장이 동일하다는 사실에 반영된다.

  • 책 해리포터 1편은 J.K. Rowlings에 의해 쓰였다.
  • J.K. Rowlings에 의해 쓰여진 책은 해리포터 1편이다.

 

책의 속성들을 언급하는 순서가 책의 설명을 바꾸지는 않기 때문에, 이 문장들의 의미는 동일하다.

 

텍스트 표현은 Blockly에서 사전이 출력 될 때와 속성 탐색기에서 사전의 값을 보여주기 위해서 사용된다. 아래의 그림은 위에서 사용된 “aBook” 사전의 예시가 이어지는 것이다. 여기서, 사전은 “aBook” 속성의 값과 이 속성이 출력되는 값으로 설정되었었다. Blockly 프로그램이 실행될 때, 결과 필드는 텍스트 형식으로 출력된 사전 값을 보여 주고, 속성 탐색기는 텍스트 표기로 나타내어지는 값을 가지고 있는 사전형(type)인 “aBook”의 속성을 보여준다. “aBook” 속성 값이 사전 전체를 나타낸다. 이것은 사전이 전체적으로 얼마나 많은 키/값 쌍을 갖든지 하나의 값이라는 것을 의미하기 때문에 중요하다.


../_images/Abstraction-Blockly-Dictionary-Text-Notation.png
그림 4-5. Blockly에서 사전 텍스트 표기의 사용

 

사전의 접근 속성 값은 그 값과 관련된 키를 지정함으로써 사전에서 검색되는 것을 의미한다. 위의 예시에서 책의 길이를 검색하기 위해서, 즉 320이라는 값에 접근하기 위해 ‘page count’가 키로 사용될 수 있다. 그림 상단에서 ‘page count’키의 열을 발견한 후에 같은 열에서 이 키 아래의 값을 사용하는 것을 의미한다.

 

Blockly에서, 키와 관련된 값은 다음 그림에서 보여 지는 것처럼 얻을 수 있다. 이 그림은 위에서 시작되었던 aBook 예제가 계속되는 것이다. 이 그림에서, get key from dict 블록은 Dicts 메뉴에서 선택되었다. get key로 삽입된 슬롯(slot)은 문자열로 page count 키이다. from dict 슬롯은 aBook 속성을 위한 블록을 포함한다. get key from dict 블록은 aBook사전의 지정된 키와 관련된 값을 나타낸다. 이 예시에서, 값은 length속성의 값으로 설정된다. length 값은 출력 되고, 속성 탐색기에서 보여 질 수 있다. 이 경우에 length 값은 320이다.


../_images/Abstraction-Blockly-Dictionary-Access.png그림 4-6. Blockly 사전에서 키와 관련된 값에 접근

 

텍스트 표현에서 키와 관련된 값에 접근하는 것은 다음과 같이 쓰여 질 수 있다.

length=aBook['page count']
how_much=aBook['price']

 

위의 두 문장에서 length는 aBook 사전의 ‘page count’ 키와 관련된 값으로 설정되었고, how_much는 aBook 사전의 ‘price’ 키와 관련된 값으로 설정하는 것을 의미한다.
사전에서 추가는 단순 사전에 키-값 쌍을 지정하여 사전에 새로운 요소를 추가하는 것을 의미한다. 도표로된 표현에서 이것은 새로운 열을 추가하는 것을 의미한다. Blockly에서, 키/값은 사전이 만들어 졌던 방법과 거의 같은 방식으로 사전에 추가된다. 새로운 키/값 쌍을 추가하기 위해서, Create Dictionary 블록의 edit 아이콘을 누르고 키/값 블록을 사전 추가 블록의 내부 공간으로 끌어온다. 텍스트 표현에서, 위의 aBook 사전에 무게를 추가하기 위해서 다음과 같이 쓸 수 있다.

book['weight']=2.7

 

이를 통해 기존의 aBook 사전에 키-값 쌍 ‘무게’: 2.7이 추가된다는 것을 의미한다.

 

 

Multiple Choice 사전의 요소들은 같은 자료형 일 필요가 없다.


 

Multiple Choice 사전의 요소들에는 순서가 존재한다.


 

Multiple Choice 위 그림 4-2는 사전 도식이다. 틀린 것을 고르시오



 

Multiple Choice 위의 그림 4-4sms 사전 정의 블록에서 키와 값은 각각 3개이다.


 

Multiple Choice 위의 사전 정의를 코드로 바꾸면 {‘author’:‘J.K Rowlings’, ‘price’:7.48, ‘page count’:320}이다.


 

Multiple Choice
aBook={'page count':320,'price':7.48,'author':'J.K. Rowlings',
‘paperback’:True, 'title':'Harry Potter #1'}
위의 문장에서 page count인 320을 length 변수에 대입하고자 한다. 올바른 문장을 고르시오




 

Multiple Choice
fruits = { banana : ‘1000’, peach : ‘1101’ }
위와 같을 때, 문장에 대한 설명으로 올바른 것을 고르시오
fruits{'apple'}=‘1010’





4.2.4 사전과 리스트의 요약

두 가지 이상의 복합적인 값을 구성하는 두 가지의 자료구조는 리스트와 사전이다. 이 두 가지 자료구조 사이의 비교는 다음 표에 나와 있다. 값의 구조를 적절하게 설계하는 것은 값의 특성에 따라 적절한 자료구조를 선택하는 것을 의미한다. 실제 상황에서는 리스트와 사전이 함께 사용된다. 사전과 리스트를 함께 사용하는 예는 다음 장에서 보게 될 것이다.

표 4-2. 리스트와 사전 비교

 리스트사전
구성원소

원소들은 같은 자료형(type)이고, 개념적으로 같다.

원소들은 같은 자료형 일 필요가 없고 개념적으로 다르다.

구성

순서가 있는 원소들

순서가 없는 키-값 쌍들

접근

for-each 반복의 사용이나 위치에 의해 한 번에 하나 씩

키와 관련 있는 값을 반환

수정

리스트 마지막에 붙이기

새로운 키-값 쌍을 추가

Leave a Reply

Your email address will not be published. Required fields are marked *

*