가장 빨리 만나는 Go 언어 Unit 55. 컨테이너 사용하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

컨테이너 사용하기

이재홍 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)
}

그림 55-1 연결 리스트


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2015-06-01