연결 데이터 구조

Uno·2021년 4월 11일
0

연결 데이터 구조 == Linked data structures
Q. 뭘로 연결되어 있나요?
A. “포인터” 라는 개념을 통해서 연결되어 있습니다. 포인터라는 개념에 대한 좋은 설명이 많이 있지만, “주소” 정도로 이해하시면 편하실겁니다. 어떤 인덱스에 값을 넣고 추가로 다음 값에 대한 주소를 가지고 있는 것입니다.

Q. 포인터라는 건 주소라고 하는데 어떤 주소인가요?
A. 메모리 상의 주소입니다. 메모리 마다 각자의 주소가 있고 그 주소에는 값이 있습니다. 그래서 주소를 안다면 그 내부에 값에 도달할 수 있겠죠?
연결 데이터 구조 중 “연결 리스트(Linked List)” 에 대해서 자세히 알려드릴께요!

연결 리스트

연결 리스트는 하나하나의 Node(노드)가 기본 단위입니다. 이 노드들이 연결되어 하나의 연결 리스트를 만듭니다.
하나의 노드에는 자기자신의 값 + 다음 값에대한 주소 로 구성되어 있습니다. 연결 리스트에도 종류가 있습니다. 자세한 것들은 추후에 다시 다루겠습니다. 그 중 가장 기본인 “단일 연결 리스트” 예시를 보여드리겠습니다.

단일 연결 리스트 클래스)

class LinkedList<T> {
	var item: T?
	var next: LinkedList<T>?
}

코드를 보면 제가 설명드렸던 자기자신의 값 == item 입니다.
그리고 next는 다음 노드에 대한 정보입니다. 아마 스위프트에 익숙하지 않으시다면 T가 무엇일지 궁굼하실 것 같네요.
Q. 맞아요. T가 뭔가요? 느낌상 Type의 T 같긴한데…. 정확히는 모르겠어요,
A. 네 T는 타입입니다. 근데 왜 T라고 적을까요? Int도 될 수 있고 String이 될 수도 있고 그렇게 적으면 편하지 않을까요?
Q. 그러니까요. 괜히 공부안한 저를 반성하게 되네요…
A. 두려워하실 필요 없습니다. 저 T는 우리를 도와주기 위한 개념이니까요.
만약에 두 값을 서로 swap 해주는 메소드가 있다고 가정해볼께요.

두 값을 바꿔주는 메소드)

func swapTwoInts( first: inout Int, second: inout Int) {
    let temp = first
    first = second
    second = temp
}

var first = 1
var second = 2

swapTwoInts(first: &first, second: &second)
print("first: \(first)")
print("second: \(second)")

그런데 제가 만약 입력값인 first와 second를 Int에서 Double로 변경하고 싶으면 어쩌죠?
그러면 새로운 메소드를 또 만들어야하죠. 이럴 때 T라는것으로 대체한다면 하나만 만들어도 다양한 타입에 대응할 수 있도록 도와주는 겁니다.
다음 처럼 T를 추가해주기만하변됩니다.

func swapTwoInts<T>( first: inout T, second: inout T) {
    let temp = first
    first = second
    second = temp
}

var first = 1
var second = 2

swapTwoInts(first: &first, second: &second)
print("first: \(first)")
print("second: \(second)")

잠시 연결리스트 설명하다가 제네릭 함수에 대한 설명을 했네요. 추후에 제네릭함수 제네릭개념관련해서 설명하겠습니다!

profile
iOS & Flutter

0개의 댓글