저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
컨테이너 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
다양한 데이터를 다룰 때 자료구조는 필수적으로 사용하게 됩니다. 자료구조를 일일이 구현하기에는 시간과 노력이 많이 듭니다. Go 언어는 기본 자료구조를 패키지로 제공하므로 편리하게 데이터를 다룰 수 있습니다.
Go 언어에서 제공하는 자료구조는 다음과 같습니다.
- 연결 리스트: 각 노드를 한 줄로 연결한 자료구조입니다.
- 힙: 이진 트리(Binary tree)를 활용한 자료구조입니다. 부모 노드에서 자식 노드가 대소관계를 이루며 정렬이 되는 것이 특징입니다.
- 링: 각 노드가 원형으로 연결된 자료구조입니다.
연결 리스트 사용하기
다음은 container/list 패키지에서 제공하는 연결 리스트 함수입니다.
- func New() *List: 연결 리스트 생성
- *func (l List) PushBack(v interface{}) *Element: 연결 리스트의 맨 뒤에 데이터 추가
- **func (l List) Front() \Element: 연결 리스트의 맨 앞 데이터를 가져옴
- *func (l List) Back() *Element: 연결 리스트의 맨 뒤 데이터를 가져옴
연결 리스트를 생성한 뒤 데이터를 넣고, 각 노드를 순회해보겠습니다.
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New() // 연결 리스트 생성
l.PushBack(10) // 연결 리스트에 데이터 추가
l.PushBack(20)
l.PushBack(30)
fmt.Println("Front ", l.Front().Value) // 연결 리스트의 맨 앞 데이터를 가져옴
fmt.Println("Back ", l.Back().Value) // 연결 리스트의 맨 뒤 데이터를 가져옴
for e := l.Front(); e != nil; e = e.Next() { // 연결 리스트의 맨 앞부터 끝까지 순회
fmt.Println(e.Value)
}
}
실행 결과
Front 10
Back 30
10
20
30
Go 언어의 연결 리스트는 이중 연결 리스트(Doubly linked list)입니다. 따라서 앞, 뒤 양쪽 방향으로 순회할 수 있습니다.
list.New 함수로 연결 리스트를 생성한 뒤 PushBack 등의 함수로 데이터를 추가합니다. 다음은 연결 리스트에서 사용할 수 있는 함수입니다.
함수 | 설명 |
---|---|
PushBack | 맨 뒤에 노드를 추가합니다. |
PushFront | 맨 앞에 노드를 추가합니다. |
PushBackList | 맨 뒤에 다른 리스트를 붙입니다. |
PushFrontList | 맨 앞에 다른 리스트를 붙입니다. |
InsertAfter | 특정 노드 뒤에 노드를 추가합니다. |
InsertBefore | 특정 노드 앞에 노드를 추가합니다. |
MoveAfter | 노드를 특정 노드 뒤로 옮깁니다. |
MoveBefore | 노드를 특정 노드 앞으로 옮깁니다. |
MoveToBack | 노드를 맨 뒤로 옮깁니다. |
MoveToFront | 노드를 맨 앞으로 옮깁니다. |
Len | 리스트의 노드 개수(길이)를 구합니다. |
Remove | 특정 노드를 삭제합니다. |
표 55-1 연결 리스트 함수 |
l.Front().Value, l.Back().Value와 같이 리스트에서 맨 앞, 맨 뒤의 노드에서 값을 가져옵니다. 다음과 같이 for 반복문을 사용하면 맨 앞부터 끝까지 리스트를 순회할 수 있습니다.
for e := l.Front(); e != nil; e = e.Next() { // 연결 리스트의 맨 앞부터 끝까지 순회
fmt.Println(e.Value)
}
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.