본문 바로가기

Data Structure in Swift

자료구조(Data Structure)에 대한 기본적인 이해

자료구조란 무엇인가?

 

우리가 공부할 자료구조라는 것이 무엇인지 이야기해보자.

자료구조에서는 데이터를 표현하고 저장하는 방법에 대해서 설명한다

내가 본 책에는 이런 말이 있다.

 

    "프로그램이란 데이터를 표현하고, 그렇게 표현된 데이터를 처리하는 것이다."

 

위에서 말하는 '데이터의 표현'은 '데이터의 저장'을 포함하는 개념이다.

'데이터의 저장'을 담하는 것은 바로 자료구조(Data Structure)이다.

 

우리가 항상 코딩을 할 때 선언해주는 어떤 데이터 타입(Int, Float, Character, String)의 변수도

구조체의 정의도 자료구조에 속한다.

Int형 변수도, 구조체도 데이터를 표현 및 저장하는 방법중의 하나이기 때문이다.

뿐만 아니라 우리는 배열을 선언해서 여러개의 정보를 저장한 적도 많다.

즉, 배열도 자료구조이다.

물론 이제부터 공부를 시작할 자료구조는 위의 내용처럼 단순하지 않다.

나는 보다 복잡한 형태의 자료구조들에 대해 이야기를 할 것이며,

이러한 자료구조는 기본적으로 아래와 같이 분류된다.

자료구조의 분류

 

위 그림에서 보이듯이 파일도 데이터를 저장하는 도구이기 때문에

파일의 구조도(파일이 데이터를 저장하는 방식도) 자료구조에 포함된다.

내가 이제 공부하면서 다뤄볼 대상은 선형구조와 비선형구조,

다시 말해서

'선형 자료구조'와 '비선형 자료구조' 이 두 가지이다.

 

선형 자료구조는 그 이름으로 알 수 있듯이 데이터를 표현하고 저장하는 방식이 선형이다.

즉, 선형 자료구조는 데이터를 선의 형태로 나란히 혹은 일렬로 저장하는 방식이다.

그래서 공부하기에 상대적으로 어렵지 않고 수월할 것이다.

반면 비선형 자료구조는 그 이름으로 알 수 있듯이

데이터를 나란히 저장하지 않는 구조이다.

따라서 선형 자료구조에 비해 상대적으로 어려움을 느낄 수 있다.

 

위의 그림으로 봤을 때 비선형 자료구조는 '트리'와 '그래프' 두 가지뿐이다.

두 가지뿐이지만, 이 둘을 기준으로 파생되는 자료구조가 적지 않다.

 

 


 

자료구조를 학습하며 추구할 방향

 

대부분의 코딩을 공부하는 학생들은 구현적 측면을 더 좋아할 것이라고 생각한다.

나도 자료구조를 학습하고 정리하는 과정에서

모든 자료구조의 구현을 가급적 상세히 설명하기 위해 노력할 것이다.

 

하지만 자료구조의 모델 자체에 대한 이해가 부족하다면

이는 큰 힘을 발휘하지 못 할 것이라고 생각한다.

 

실무에서는 자료구조를 직접 구현하지 않고 구현이 되어있는 것들을 사용한다.

그리고 그것은 합리적인 선택이다.

검증된 상태로 구현되어 있는 자료구조를 사용하고 활용하는 것이

안전성에서나 성능 면에서나 우월하다고 생각한다.

 

하지만 자료구조를 잘 가져다 쓰기 위해서는

Set이 무엇이고 Dictionary가 무엇인지 알고 써야한다.

그냥 아는 것이 아니라 각각의 특성을 정확히 이해해야 한다.

지인의 주소와 전화번호 정보를 저장하기 위한 자료구조를 선택하고 가정해보자.

이는 Array도 가능하고 Set도 가능하고 Dictionary도 가능하다.

 

선택을 하려면 각각의 자료구조를 잘 이해하고 있어야 하는 것이다.

선택을 하는데 있어서 자료구조의 구현 능력은

그리 중요하지 않을 수 있다.

 

그리고 코드 레벨에서 자료구조를 구현한 경험이 있다면

자료구조에 대해 더 잘 알게 될 것이며,

자료구조를 보는 깊이가 달라진다고 할 수 있다.

뿐만아니라,

자료구조의 구현 경험은 프로그래밍 능력을 향상시켜 줄 것이다.

자료구조를 구현하는 동안 프로그래밍 실력이 향상되지 않는다면

자료구조를 끝까지 공부하는데 무리가 따를 것이다.

 


 

자료구조와 알고리즘

 

앞서 말했듯이 자료구조가

'데이터의 표현 및 저장방법'을 뜻한다면,

알고리즘은 표현 및 저장된 데이터를 대상으로 하는

'문제의 해결 방법'을 뜻한다.

예를 들어서 다음의 배열 선언은 자료구조적 측면의 코드이다.

var arr: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

반면 배열에 저장된 모든 값의 합을 더하는 다음 반복문의 구성은

알고리즘적 측면의 코드이다.

for i in 0..<10 {
   sum += arr[i]
}

 

위의 반복문은

'배열에 저장된 모든 값의 합을 구하는 알고리즘'이라 할 수 있다.

이렇듯 자료구조와 알고리즘은 밀접한 관계를 갖는다.

자료구조가 결정되어야 그에 따른 효율적인 알고리즘을 결정할 수 있기 때문이다.

 

만약에 값이 저장된 자료구조가 배열이 아니었어도

위 코드처럼 반복문과 인덱스 값을 이용한 순차적 접근으로 진행했을까?

배열이 아니었다면 그 방법은 분명 달라졌을 것이다.

아니 달라져야 한다. 더 타당하고 합리적인 방법으로 말이다.