iOS 앱 개발 부트캠프/TIL

TIL 16일차 - 자료 구조

iosstudyletsgo 2024. 10. 7. 18:14

 

오늘은 자료 구조에 대해 공부하였다. 나중에 개발자로써 무언가 개발을 하기 위해선 자료 구조와 알고리즘의 개념에 대해 확실히 이해해야 한다는 말을 들었기 때문이었다.

 

자료 구조란?

자료 구조는 데이터를 효울적으로 저장하고 조작하는 방식을 말한다. 데이터에는 다양한 종류가 있기 때문에 그에 맞는 연산을 보다 빠르고  효율적으로 수행하기 위해 자료구조 방식이 사용된다.

전통적인 자료구조에는 배열(Array), 연결 리스트(Linked List), 스택(Stack), 큐(Queue), 트리(Tree), 그래프(Graph), 해시 테이블(Hash Table), 힙(Heap) 등이 있으며 이에 대한 내용은 다음 블로그를 참고 하였다.

https://bnzn2426.tistory.com/115

 

자료 구조(Data Structure) 개념 및 종류 정리

자료 구조란? 데이터 값의 모임, 각 원소들이 논리적으로 정의된 규칙에 의해 나열되며 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 구분하여 표현한 것. 예를 들어 한정된 크기의

bnzn2426.tistory.com

https://velog.io/@jha0402/Data-structure-개발자라면-꼭-알아야-할-7가지-자료구조

 

[Data structure] 개발자라면 꼭 알아야 할 7가지 자료구조

Array, stack, queue, linked list, hash table, graph, tree

velog.io

 

이해하기 쉽게 비유하자면 자료는 책, 메모리는 책장에 비유할 수 있다. 책장에서 원하는 책을 빨리 찾을 수 있도록 가나다 순으로 정리한다든가, 비슷한 장르의 책들을 모아 정리한다든가 하는 식으로 형태를 갖춰 정리하듯이 메모리에서 원하는 데이터를 빠르게 찾아 효율적으로 처리할 수 있도록 구조를 갖추는 것이다.

따라서 자료 구조에 대해 잘 이해하고 활용하면 메모리 공간의 효율적 사용과 처리 시간을 단축하고, 알고리즘의 복잡도도 줄일 수 있다.

 

그렇다면 Swift에서의 자료 구조는?

자료 구조는 cs(computer science)에 대한 내용으로, 언어 이전에 존재하는 컴퓨터와 데이터를 이해할 때 사용되는 개념이므로 어떤 언어든 비슷한 형태를 취한다. 그러나 내가 공부하고 있는 swift에서 과연 전부 같을까? 하는 생각에 swift에서 위 자료 구조에 대해 찾아보았다.

 

swift에서의 자료구조

배열(Array)

  • 전통적인 자료구조의 배열과 같은 개념이다. swift에서 배열은 크기가 가변적이며 메모리에 연속적으로 저장된다.
  • swift에서 배열은 값 타입이므로 배열을 복사하면 실제 값이 복사된다. append, insert, remove 등의 메서드로 배열을 동적으로 관리할 수 있다.

 

집합(Set)

  • 순서가 없고 중복을 허용하지 않는 전통적인 자료 구조를 그대로 구현한 자료구조이다.
  • 빠른 검색과 중복 요소 방지에 특화되어 있으며 집합 연산(합집합, 교집합, 차집합)을 수행할 수 있다.

 

딕셔너리(Dictionary)

  • 전통적인 자료구조의 해시테이블(Hash Table)에 해당하며 키-값 쌍을 저장하는 자료 구조이며 해시 테이블처럼 키를 이용해 값을 빠르게 검색하거나 수정할 수 있다.
  • 키는 고유한 값을 사용해야 하며, 해시 함수를 이용해 빠른 검색이 가능하다.

 

튜플(Tuple)

  • 한번에 여러 값을 묶어 표현하는 방식으로 여러 데이터 필드를 한 번에 저장하는 레코드(Record)와 유사하다.
  • 서로 다른 타입의 여러 값을 하나로 묶을 수 있고 고정된 크기를 가진다.

스택(Stack)

  • swift에는 스택을 직접 지원하는 자료구조는 없지만 배열(Array)로 스택을 구현할 수 있다. 배열의 append()와 removeLast() 메서드를 사용해 스택의 삽입(push)과 제거(pop) 동작을 구현할 수 있다.
  • 스택은 LIFO(Last In, First Out) 방식으로 작동하며 배열을 이용해 이를 구현한다.
  • 사용 예 
var stack: [Int] = []
stack.append(10) // push
let last = stack.removeLast() //pop

 

큐(Queue)

  • 큐도 마찬가지로 swift에서 직접 지원하는 자료구조는 없고 배열을 통해 큐의 삽입(enqueue)과 제거(dequeue)동작을 구현할 수 있다.
  • 큐는 FIFO(First In, First Out) 방식으로 동작하며 배열을 이용해 이를 구현한다.
  • 사용 예 
var queue: [Int] = []
queue.append(10) // enqueue
let first = queue.removeFirst() // dequeue

 

연결리스트(Linked List)

  • 연결리스트는 각 노드(node)가 데이터와 다음 노드를 가리키는 포인트로 이루어져 있어 메모리에 연속적으로 배치되지 않으며 삽입과 삭제가 빠르다.
  • 연결리스트 또한 swift에서 직접 지원하는 자료구조는 없지만 사용자가 직접 구현할 수 있다.

 

트리(Tree)

  • 트리는 최상위 노드인 루트(root) 노트에서 시작해 여러 자식(child) 노드로 이어지는 계층 구조이다.
  • 트리 또한 swift에서 직접 지원하는 자료구조는 없고 클래스를 사용해 이진 트리, AVL트리 등을 구현할 수 있다.

 

그래프(Graph)

  • 노드와 엣지로 이루어진 자료 구조로, 여러 노드들이 엣지(edge)를 통해 연결된다.
  • swift에서는 클래스를 통해 구현할 수 있다.

 

힙(Heap)

  • 힙은 완전 이진 트리의 일종으로 각 노드가 특정한 순서 규칙을 따르는 자료구조이며 일반적으로 최소 힙(Min-Heap)과 최대 힙(Max-Heap) 두가지 유형이 있다.
  • 완전 이진 트리 : 모든 레벨이 완전히 채워져 있고, 마지막 레벨은 왼쪽부터 오른쪽으로 채워져 있음을 의미한다.
  • 최소 힙 : 부모 노드의 값이 자식 노드의 값보다 작거나 같은 성질을 가지는 힙, 루트 노드에 항상 가장 작은 값이 저장된다. 가장 작은 값을 빠르게 찾을 수 있다.
  • 최대 힙 : 부모 노드의 값이 자식 노드의 값보다 크거나 같은 성질을 가지는 힙, 루트 노드에 항장 가장 큰 값이 저장된다. 가장 큰 값을 빠르게 찾을 수 있다.
  • swift에선 배열을 사용하여 힙을 구현하는 방법이 있고, 직접적으로 힙을 구현해야 할 경우 사용자 정의 구조체를 통해 간단한 힙을 만들 수 있다.

 

전통적인 자료구조 외에도 열거형(Enum)이나 옵셔널(Optional) 같은 자료구조도 있다.

  • 옵셔널은 값이 존재할 수도, 존재하지 않을 수도 있는 상황을 표현하는 자료형으로 swift의 모든 값 타입은 옵셔널이 될 수 있다. 옵셔널 타입은 안전한 nil 처리를 위해 사용되며 ? 또는 !로 선언한다.
  • 사용 예
var optionalName: String? = "John"
optionalName = nil // nil을 할당 가능
if let name = optionalName { 
	print("\(name)")
	} else {
		print("No name available")
	}
  • 열거형은 관련된 값의 집합을 정의하고 각 값이 고유한 이름을 가질 수 있도록 하는 자료구조이다. 주로 상태나 옵션을 나타낼 때 사용하며 각 열거형 값은 독립적이며 값에 연관된 추가 데이터를 가질 수 있다.
  • 사용 예
enum Direction { 
	case north, south, east, west 
    } 
var currentDirection = Direction.north
currentDirection = .west // 열거형 값 변경

 


 

여태까지 하면서 다양한 자료구조를 못 본 것 같은데 꽤나 다양한 자료 구조가 있어서 보니 역시나 따로 지원하는 경우는 없고 직접 기능을 구현해야 하는 것 같다. 다른 언어도 잠깐 살펴보니 라이브러리로 직접 지원하는 경우도 있고 아닌 경우도 있는 듯 하니 역시나 cs의 개념이기 때문에 필요한 경우 직접 코드를 짜 구현해야 하는 듯 하다.

처음에 관련 자료를 찾아볼때 자료 구조가 중요한 이유는 알고리즘과 깊게 연결되어 어느 자료구조를 선택하느냐에 따라 짜야하는 알고리즘도 결정된다고 하는 것을 봤는데, 처음엔 그런가? 싶었다가 스택은 후입선출(Last In, First Out)이고 큐는 선입선출(First In, First Out) 같은 방식의 차이를 보고 나니 무슨 뜻인지 이해하게 되었다.

또한 반대로 자료구조와 알고리즘의 개념에 대해 잘 이해하고 익숙해져 있다면 개발자로써 내가 어떠한 기능을 구현하고자 할때 대략적인 청사진을 그릴 수 있어 원하는 기능을 빠르게 구현해낼 수 있겠다는 생각이 들었다.