스택 (Stack), 큐 (Queue) 에 대하여
-Stack 과 Queue 는 데이터를 저장하고 다루는 방식을 정하는 - 자료구조 입니다.
스택 (Stack)
- 방식: 마지막에 들어간 것이, 먼저 나옵니다.(LIFO: Last ln, First Out)
함수 호출 관리 및 역순 처리가 필요한 경우
- 추가 및 삭제는 한쪽 끝에서만.[데이터 복원등, Undo 등에 주로 사용]
- 접시에 음식을 쌓아 올리면, 맨 위에 맨 마지막에 올린것 먼저 먹게 되는 원리
- 스택에 1, 2, 3을 순서대로 넣으면 꺼낼 때는 3, 2, 1 순서로 나옵니다.
stack := []int{} // 빈 스택, 빈 슬라이스를 생성해 스택처럼 사용
// 슬라이스는 동적 배열로 크기가 유동적으로 변할 수 있어요.
// 값 넣기 (Push) append
를 사용하여 값을 추가함.
// 계속 추가하면, 스택의 마지막 부분에 값이 쌓이는 형태가 됨.
stack = append(stack, 1) // 1을 스택에 추가, 기존 stack
에 1
을 추가한 새로운 슬라이스를 반환
stack = append(stack, 2) // 2를 스택에 추가
stack = append(stack, 3) // 3을 스택에 추가
fmt.Println("스택 상태:", stack)
// 값 꺼내기 (Pop)
for len(stack) > 0 {
n := stack[len(stack)-1] // 가장 위에 있는 값, 스택의 마지막 요소(값)를 가져옴
// len 함수는 슬라이스, 배열, 문자열, 맵, 채널 등의 길이나 크기를 반환
// 내장 함수이며- 길이나 개수를 알고 싶을 때 사용함.
stack = stack[:len(stack)-1] // 마지막 값(요소) 제거
// 마지막 요소를 제외한 슬라이스를 반환해 값을 꺼내는 효과
fmt.Println("꺼낸 값:", n)
fmt.Println("현재 스택:", stack)
}
큐 (Queue)
- 방식: 먼저 들어간것이 먼저 나옵니다.(FIFO: First in, First Out)
데이터를 순서대로 사용(처리)이 필요한 경우
- 추가는 뒤에서, 삭제는 앞에서. [CPU 및 대기열 및 이벤트 관리등에 사용]
- 그물방 채반안에, 과일을 씻기 위해, 물을 뿌리면, 먼저 들어간 물이 먼저 떨어지는 원리.
- 큐에 1, 2, 3을 넣으면 꺼낼 때는 1, 2, 3 순서로 나옵니다.
queue := []int{} // 빈 큐, 빈 슬라이스를 생성하여 큐로 사용
// 값 넣기 (Enqueue), append
를 사용해 값을 추가, 추가된 값은 항상 큐의 맨 뒤에 위치
queue = append(queue, 1) // 1을 큐에 추가
queue = append(queue, 2) // 2를 큐에 추가
queue = append(queue, 3) // 3을 큐에 추가
fmt.Println("큐 상태:", queue)
// 값 꺼내기 (Dequeue)
for len(queue) > 0 {
n := queue[0] // 가장 앞에 있는 값, 큐의 첫 번째 값을 가져옴
queue = queue[1:] // 첫 번째 요소를 제외한 슬라이스를 반환해 값을 꺼내는 효과를 냄.
fmt.Println("꺼낸 값:", n)
fmt.Println("현재 큐:", queue)
}
append 함수
-Go언에서 append는 슬라이스에 새 요소를 추가하는 내장 함수임.
- append는 슬라이스에 값을 추가하는 간단한 방법
- 큰 슬라이스에서 빈번히 append를 사용하면 성능에 영향을 줌(슬라이스의 용량이 부족하면 새 메모리 공간을 할당하고 데이터를 복사 하기에)
- 스택에서는 append로 값을 쌓고, 슬라이스의 마지막 요소를 꺼내 삭제.
- 큐에서는 append로 값을 줄 세우고, 슬라이스의 첫 번째 요소를 꺼내 삭제.
append 기본 사용법
slice := []int{1, 2}
slice = append(slice, 3) // [1, 2, 3]
// 기존 슬라이스 slice
에 3
을 추가한 새로운 슬라이스를 반환
// 기존 슬라이스는 변경되지 않고, 새로운 슬라이스가 생성되므로 반드시 대입해야 함.
append 다중 요소 추가- 여러 값을 한 번에 추가
slice = append(slice, 4, 5, 6) // [1, 2, 3, 4, 5, 6]
append 슬라이스 병합 - ...
을 사용하면 다른 슬라이스의 모든 요소를 추가
otherSlice := []int{7, 8}
slice = append(slice, otherSlice...) // [1, 2, 3, 4, 5, 6, 7, 8]