1. 배열
거의 모든 프로그래밍 언어는 서로 연관된 변수 값을 묶어서 저장할 수 있는 배열이라는 기능을 제공한다. 이 배열이 프로그래밍에서 매우 유용한 이유는 메모리의 효율적인 관리와 관련이 있다. 배열이 어떻게 효율적인 메모리 관리에 도움이 되는지 살펴보려면 조금 옛날로 돌아가 C언어가 주력으로 사용되던 시점으로 돌아가야 한다.
C 언어에서 변수 3개를 int 형태로 선언해보려 한다. 이 변수들을 선언하면 메모리에 다음과 같은 일이 발생한다.
각각의 변수값이 메모리의 임의 구역에 저장되며, 해당 구역은 변수명으로 이름이 지정된다. 대부분의 C 언어 기본서에서는 변수명이 적혀있는 상자에 값이 저장되는 것으로 설명을 하는데, 위의 그림에 대입하자면, 메모리의 여러 상자 중, 1이 들어간 상자는 a라고 지정, 2가 들어간 상자는 b라고 지정하는 형태다. 문제는 이 값들이 메모리의 이곳저곳에 랜덤하게 배치되는 까닭에, 이들 값이 서로 연관성이 있는 값(예를 들면 학생의 3과목 시험 점수)이라면 변수값을 호출하기 위해 메모리에서 찾는 과정에서 시간이 어느정도 소모되게 된다.
그럼, 배열은 어떻길래 서로 연관있는 값을 빠르게 호출할 수 있다는 것일까?
배열 내에 선언된 값은 메모리 내의 아무곳에 저장되는 것이 아니라, 서로 인접한 위치에 저장되게 된다. 그리고 a_array의 주소는 첫 원소가 들어있는, 1이 저장되어 있는 메모리의 주소를 가리킨다. 따라서 a_array의 값을 index([0]과 같이)로 호출하게 되면, 이곳 저곳에 흩어져 값이 저장되어 있던 상태와 비교했을 때 훨씬 빠른 호출이 가능하게 된다.
참고로, Python에서는 변수와 배열 선언 시 조금 다르게 동작하는데, 각각의 값(객체)들은 메모리의 특정 위치에 생성되고, 변수명과 배열명이 해당 메모리 주소를 참조하도록 하는 형태이다.
Python에서 각 값들이 위치한 메모리 ID를 id() 함수를 사용하여 확인할 수 있는데, 변수명/배열명 역시 메모리에 따로 저장되어 있으며, 이들이 메모리 내에 생성된 값이 위치한 주소를 참조하는 방식이기 때문에, 변수명과 변수값 또는 배열명과 배열값의 메모리 ID가 동일하게 나오는 것을 알 수 있다.
2. 선형 자료구조
다른 프로그래밍 언어와 마찬가지로, Python 역시 배열을 사용할 수 있다. 그러나, 배열의 경우 자료형이 같은 값만 저장이 가능하기 때문에, 자료형이 달라도 배열의 형태로 저장할 수 있는 List 기능이 있는 Python에서 배열을 사용할 일이 거의 없다.
그럼에도 불구하고 필자가 배열에 대한 이야기를 꺼낸 이유는 무엇일까? 다시 자료구조의 의미에 대해 확인해보자.
------------------------------------------------------------------------
자료구조: 데이터 단위, 또는 데이터 자체의 물리적 / 논리적 관계
------------------------------------------------------------------------
다른 말로 하자면 자료구조는 데이터가 모여 있는 형태가 어떤 모양인지를 본다는 의미이다. 자료구조의 두 번째 포스팅에서도 언급한 이야기지만, 처리할 자료가 많으면 많을수록 자료를 효율적으로 관리하고 구조화해야할 필요성이 있기 때문이다.
위에서 언급한 배열도 자료구조의 일종이다. C 언어의 예시에서 보았듯이 유사한 데이터를 메모리의 인접 부위에 저장하는 형태로 자료 처리의 효율성을 증가시킨다. Python에서 제공하는 List나 Tuple은 메모리에 자료를 저장하는 형태는 조금 다르지만, 선언 코드를 보면 배열과 유사하게 연관된 값을 나열하는 것을 알 수 있다.
C언어 배열 선언 : int c_array[4] = {10, 20, 30, 30};
Python List 선언 : p_list = [10, 20, 30, 40]
Python Tuple 선언: p_tuple = (10, 20, 30, 40)
Python에서 List와 Tuple은 배열의 일종으로 취급하며, 이렇게 자료를 순차적으로 나열하여 자료를 저장하기에 배열은 선형 자료구조의 한 종류로 본다(다른 선형 자료구조 형태로는 연결형 리스트, 스택, 큐가 있는데, 이에 대해서는 추후 포스팅을 진행할 예정이다).
이번 포스팅에서는 선형 자료구조 중 한 종류인 배열에 대하여, 그리고 Python 내에서의 선형 자료 구조인 List와 Tuple의 데이터 저장 방식에 대해 간략히 살펴보았다.
배열에서 처리할 수 있는 작업의 종류는 대략 아래와 같이 나열할 수 있을 것이다.
- 배열 내 원소 값 중 최대값/최소값 출력
- 배열 내 원소 값의 역순 출력
- 배열의 복사
- 배열의 원소 값 검색(선형 검색, 이진 검색, 해시법)
- 배열 값 정렬
다음 포스팅에서는 위에서 언급한 처리 작업을 완성할 수 있는 여러 방법을 살펴보고, 가장 효율적인 구조가 무엇인지, 그리고 왜 효율적인 동작이 가능한지에 대해 살펴보려 한다.
Fin.
'Python > Python Data Structure and Algorithm' 카테고리의 다른 글
[자료구조 with Python] 5. 선형 자료 구조 - 배열(4), Hash검색 (0) | 2021.01.10 |
---|---|
[자료구조 with Python] 5. 선형 자료 구조 - 배열(3), 선형/이진 검색 (0) | 2021.01.05 |
[자료구조 with Python] 4. 선형 자료 구조 - 배열(2), 기본 메서드/함수 동작 (0) | 2021.01.02 |
[자료구조 with Python] 2. 알고리즘이란. (0) | 2020.12.12 |
[자료구조 with Python] 1. 왜 갑자기 자료구조인가? (0) | 2020.12.10 |
댓글