목차
1 자료구조와 알고리즘
2 재귀와 귀납적 사고
3 재귀 실습
4 리스트
5 이중 연결 리스트
6 이중 연결 리스트 실습 흐름
7 스택
8 스택 구현 실습
9 큐
10 큐 구현 실습
1 자료구조와 알고리즘
1) 자료구조의 개념
(1) 자료구조
자료구조는 데이터를 효율적으로 저장하고 조직화하는 방법이다.
단순히 데이터를 저장하는 것이 아니라, 데이터를 어떻게 넣고, 찾고, 삭제하고, 관리할지까지 고려한 저장 방식이다.
(2) 자료구조가 필요한 이유
프로그램은 데이터를 계속 저장하고 꺼내서 사용한다.
이때 어떤 자료구조를 선택하느냐에 따라 검색 속도, 삽입 속도, 삭제 속도, 메모리 사용량이 달라진다.
(3) 성능에 미치는 영향
같은 데이터를 다루더라도 배열, 연결 리스트, 스택, 큐 중 무엇을 쓰느냐에 따라 프로그램의 성능이 달라진다.
그래서 자료구조는 알고리즘의 성능을 좌우하는 중요한 요소이다.
2) 알고리즘의 개념
(1) 알고리즘
알고리즘은 문제를 해결하기 위한 절차나 방법이다.
데이터를 어떻게 저장할지가 자료구조라면, 그 데이터를 어떻게 처리할지가 알고리즘이다.
(2) 자료구조와 알고리즘의 관계
자료구조는 데이터를 담는 그릇이고, 알고리즘은 그 데이터를 이용해 문제를 푸는 방법이다.
좋은 알고리즘도 자료구조가 맞지 않으면 느려질 수 있고, 좋은 자료구조도 잘못된 알고리즘을 쓰면 효율이 떨어질 수 있다.
3) 알고리즘 복잡도
(1) 알고리즘 복잡도
알고리즘 복잡도는 알고리즘이 실행될 때 필요한 시간과 메모리를 분석하는 기준이다.
입력 데이터가 많아질수록 실행 시간이 얼마나 늘어나는지, 메모리를 얼마나 사용하는지 판단할 때 사용한다.
(2) 시간 복잡도
시간 복잡도는 입력 크기에 따라 실행 시간이 얼마나 증가하는지를 나타낸다.
데이터가 적을 때는 차이가 작아도, 데이터가 많아지면 시간 복잡도 차이가 크게 느껴진다.
(3) 공간 복잡도
공간 복잡도는 알고리즘이 실행되는 동안 필요한 메모리 공간을 의미한다.
배열, 객체, 재귀 호출 스택처럼 프로그램 실행 중 사용하는 메모리를 고려한다.
(4) Big-O 표기법
Big-O 표기법은 알고리즘의 성능을 입력 크기 기준으로 표현하는 방법이다.
보통 최악의 경우를 기준으로 알고리즘이 얼마나 효율적인지 비교할 때 사용한다.
2 재귀와 귀납적 사고
1) 재귀의 개념
(1) 재귀
재귀는 함수가 자기 자신을 다시 호출해서 문제를 해결하는 방식이다.
큰 문제를 같은 형태의 작은 문제로 나눌 수 있을 때 사용한다.
(2) 재귀를 사용하는 이유
어떤 문제는 반복문보다 재귀로 표현했을 때 구조가 더 자연스럽다.
팩토리얼, 최대공약수, 하노이의 탑처럼 문제 자체가 작은 문제의 반복으로 이루어진 경우에 적합하다.
(3) 종료 조건
재귀 함수에는 반드시 종료 조건이 있어야 한다.
종료 조건이 없으면 함수가 계속 자기 자신을 호출해서 끝나지 않는다.
2) 귀납적 사고
(1) 귀납적 사고
귀납적 사고는 작은 경우가 맞다는 것을 바탕으로 더 큰 경우도 맞다고 생각하는 방식이다.
재귀는 가장 작은 문제를 해결한 뒤, 그 결과를 이용해 더 큰 문제를 해결한다는 점에서 귀납적 사고와 비슷하다.
(2) 재귀와 수학적 귀납법
수학적 귀납법은 가장 작은 경우가 참이고, 어떤 경우가 참이면 다음 경우도 참이라는 방식으로 증명한다.
재귀 알고리즘도 가장 작은 문제를 직접 해결하고, 나머지는 작은 문제의 결과를 이용해 해결한다.
(3) 재귀 알고리즘 이해 방법
재귀를 이해할 때는 함수가 계속 호출되는 모든 과정을 억지로 따라가기보다, 작은 문제를 해결할 수 있다고 믿고 큰 문제를 어떻게 해결하는지 보는 것이 중요하다.
3 재귀 실습
1) 팩토리얼 재귀
(1) 팩토리얼
팩토리얼은 1부터 특정 숫자까지 모두 곱한 값이다.
예를 들어 5의 팩토리얼은 5 × 4 × 3 × 2 × 1이다.
(2) 반복문 방식
반복문 방식은 2부터 입력받은 수까지 차례대로 곱해서 결과를 만든다.
같은 작업을 정해진 횟수만큼 반복할 때 for문을 사용할 수 있다.
(3) 재귀 방식
재귀 방식에서는 factorial(no)가 no × factorial(no - 1)을 반환한다.
즉, 큰 문제를 현재 숫자와 더 작은 팩토리얼 문제로 나누어 해결한다.
(4) 종료 조건
no가 1이면 더 이상 자기 자신을 호출하지 않고 1을 반환한다.
이 조건이 있어야 재귀 호출이 멈춘다.
2) 유클리드 호제법
(1) 최대공약수
최대공약수는 두 수를 모두 나눌 수 있는 가장 큰 수이다.
예를 들어 26과 6의 최대공약수는 두 수를 공통으로 나눌 수 있는 가장 큰 값이다.
(2) 유클리드 호제법
유클리드 호제법은 두 수의 최대공약수를 구하는 알고리즘이다.
큰 수를 작은 수로 나눈 나머지를 이용해 문제를 점점 작게 만든다.
(3) 재귀 구조
eculid(no1, no2)는 no2가 0이면 no1을 반환한다.
no2가 0이 아니면 eculid(no2, no1 % no2)를 다시 호출한다.
(4) 사용하는 이유
유클리드 호제법은 반복적으로 나머지를 구하면서 최대공약수를 빠르게 찾을 수 있다.
단순히 모든 수로 나눠보는 방식보다 효율적이다.
3) 하노이의 탑
(1) 하노이의 탑
하노이의 탑은 여러 개의 원판을 한 기둥에서 다른 기둥으로 옮기는 문제이다.
큰 원판은 작은 원판 위에 올릴 수 없다는 규칙이 있다.
(2) 재귀적 사고
원판 n개를 옮기려면 먼저 n-1개의 원판을 보조 기둥으로 옮긴다.
그다음 가장 큰 원판을 목표 기둥으로 옮기고, 다시 n-1개의 원판을 목표 기둥으로 옮긴다.
(3) 보조 기둥 계산
기둥 번호가 1, 2, 3일 때 세 기둥의 합은 6이다.
시작 기둥이 x이고 목표 기둥이 y이면, 남은 보조 기둥은 6 - x - y로 구할 수 있다.
(4) 실습 코드의 의미
hanoi(3, 1, 3)은 원판 3개를 1번 기둥에서 3번 기둥으로 옮기는 과정을 출력한다.
실제로 원판을 옮기는 동작을 출력문으로 확인하면서 재귀 호출 흐름을 이해하는 실습이다.
4 리스트
1) 리스트의 개념
(1) 리스트
리스트는 여러 데이터를 순서대로 저장하는 자료구조이다.
데이터가 순서를 가지기 때문에 앞에서부터 차례대로 접근하거나 특정 위치의 데이터를 다룰 수 있다.
(2) 배열 리스트
배열 리스트는 연속된 메모리 공간에 데이터를 저장한다.
인덱스로 빠르게 접근할 수 있지만, 중간 삽입과 삭제에는 데이터 이동이 필요하다.
(3) 연결 리스트
연결 리스트는 데이터를 노드 단위로 저장하고, 각 노드가 다음 노드를 가리키는 방식이다.
삽입과 삭제는 비교적 쉽지만, 특정 위치로 바로 이동하려면 처음부터 따라가야 한다.
2) 연결 리스트의 종류
(1) 단일 연결 리스트
단일 연결 리스트는 각 노드가 다음 노드의 주소만 가진다.
한 방향으로만 이동할 수 있다.
(2) 이중 연결 리스트
이중 연결 리스트는 각 노드가 이전 노드와 다음 노드의 주소를 모두 가진다.
양방향 이동이 가능하기 때문에 현재 노드 기준으로 앞뒤 노드를 쉽게 이동할 수 있다.
(3) 원형 연결 리스트
원형 연결 리스트는 마지막 노드가 다시 처음 노드를 가리키는 구조이다.
끝과 시작이 연결되어 반복적인 순환 구조를 만들 수 있다.
5 이중 연결 리스트
1) DoubleLinkedList의 개념
(1) DoubleLinkedList
DoubleLinkedList는 이중 연결 리스트를 직접 구현한 클래스이다.
하나의 노드가 데이터, 이전 노드 주소, 다음 노드 주소를 함께 가진다.
(2) 제네릭 E
DoubleLinkedList<E>에서 E는 저장할 데이터 타입을 외부에서 정할 수 있게 해준다.
문자열도 저장할 수 있고, Data 같은 사용자 정의 객체도 저장할 수 있다.
(3) Node 클래스
Node는 이중 연결 리스트의 한 칸을 의미한다.
data에는 실제 값이 들어가고, prev와 next는 이전 노드와 다음 노드를 가리킨다.
2) head와 crnt
(1) head
head는 리스트의 시작 기준이 되는 더미 노드이다.
실제 데이터를 저장하기보다 리스트의 시작과 끝을 관리하는 기준점 역할을 한다.
(2) crnt
crnt는 현재 선택된 노드를 의미한다.
검색에 성공한 노드, 방금 추가한 노드, 삭제 후 이동한 노드처럼 현재 작업 기준이 되는 위치를 저장한다.
(3) 더미 노드를 사용하는 이유
head 더미 노드를 사용하면 리스트가 비어 있을 때와 데이터가 있을 때의 처리를 통일하기 쉽다.
첫 노드와 마지막 노드를 추가하거나 삭제할 때 예외 처리가 줄어든다.
3) 주요 메소드
(1) isEmpty
isEmpty는 리스트가 비어 있는지 확인한다.
head.next가 head를 가리키면 실제 데이터 노드가 없는 상태이다.
(2) search
search는 Comparator를 이용해 원하는 데이터를 찾는다.
데이터를 처음부터 끝까지 순회하면서 비교 결과가 0이면 같은 데이터로 판단한다.
(3) dump
dump는 리스트의 모든 데이터를 앞에서부터 출력한다.
head.next부터 시작해 다시 head를 만날 때까지 이동하면서 데이터를 확인한다.
(4) add
add는 현재 노드 바로 뒤에 새 노드를 추가한다.
새 노드의 prev와 next를 연결하고, 기존 노드들의 연결도 새 노드를 포함하도록 바꾼다.
(5) addFirst
addFirst는 리스트의 맨 앞에 데이터를 추가한다.
crnt를 head로 옮긴 뒤 add를 호출해서 첫 번째 위치에 새 노드를 넣는다.
(6) addLast
addLast는 리스트의 맨 뒤에 데이터를 추가한다.
crnt를 마지막 노드로 옮긴 뒤 add를 호출해서 마지막 위치에 새 노드를 넣는다.
(7) next
next는 현재 노드를 다음 노드로 이동한다.
다음 노드가 head이면 더 이상 이동할 실제 데이터가 없으므로 false를 반환한다.
(8) prev
prev는 현재 노드를 이전 노드로 이동한다.
이전 노드가 head이면 더 이상 이동할 실제 데이터가 없으므로 false를 반환한다.
(9) removeCrnt
removeCrnt는 현재 노드를 삭제한다.
현재 노드의 이전 노드와 다음 노드를 서로 연결해서 현재 노드가 리스트에서 빠지게 만든다.
(10) removeFirst
removeFirst는 첫 번째 노드를 삭제한다.
crnt를 head.next로 이동한 뒤 removeCrnt를 호출한다.
(11) removeLast
removeLast는 마지막 노드를 삭제한다.
crnt를 head.prev로 이동한 뒤 removeCrnt를 호출한다.
(12) clear
clear는 리스트의 모든 노드를 삭제한다.
리스트가 빌 때까지 removeFirst를 반복한다.
6 이중 연결 리스트 실습 흐름
1) 문자열 리스트 실습
(1) 문자열 저장
DoubleLinkedList<String>을 생성하면 문자열을 저장하는 이중 연결 리스트가 만들어진다.
addFirst를 여러 번 호출해서 데이터를 앞쪽에 계속 추가한다.
(2) 출력 확인
dump를 호출하면 현재 리스트에 들어 있는 문자열들이 순서대로 출력된다.
addFirst는 앞쪽에 추가하므로 나중에 넣은 값이 앞쪽에 위치한다.
(3) 삭제 실습
removeFirst는 첫 번째 노드를 삭제하고, removeLast는 마지막 노드를 삭제한다.
prev와 removeCrnt를 함께 사용하면 현재 위치를 이동한 뒤 그 위치의 노드를 삭제할 수 있다.
(4) 전체 삭제
clear를 호출하면 리스트 안의 모든 노드를 삭제한다.
이후 dump를 실행하면 출력할 데이터가 없는 상태가 된다.
2) 객체 리스트 실습
(1) Data 객체 저장
DoubleLinkedList<Data>는 Data 객체를 저장하는 리스트이다.
Data 객체는 번호와 이름을 필드로 가진다.
(2) toString 활용
Data 클래스의 toString이 정의되어 있기 때문에 dump로 출력하면 번호와 이름이 보기 좋게 출력된다.
객체 자체를 출력할 때 toString 결과가 사용된다.
(3) Comparator 활용
NameOrder는 Comparator<Data>를 구현해서 Data 객체의 name 값을 기준으로 비교한다.
search 메소드에서 Comparator를 사용하면 객체 안의 특정 기준으로 데이터를 찾을 수 있다.
(4) 검색 실습
search는 비교 기준에 따라 같은 데이터를 찾으면 해당 데이터를 반환한다.
이름이 일치하는 Data 객체를 찾는 방식으로 객체 검색 흐름을 확인할 수 있다.
7 스택
1) 스택의 개념
(1) 스택
스택은 마지막에 넣은 데이터가 가장 먼저 나오는 자료구조이다.
후입선출 구조라고 부르며, 영어로는 LIFO라고 한다.
(2) LIFO
LIFO는 Last In First Out의 줄임말이다.
가장 마지막에 들어온 데이터가 가장 먼저 나간다는 의미이다.
(3) 스택을 사용하는 상황
함수 호출, 실행 취소, 괄호 검사처럼 마지막 작업을 먼저 처리해야 하는 상황에서 스택을 사용할 수 있다.
데이터를 위로 쌓고 위에서부터 꺼내는 구조라고 생각하면 이해하기 쉽다.
2) 스택 주요 연산
(1) push
push는 스택에 데이터를 추가하는 연산이다.
새 데이터는 스택의 가장 위쪽에 저장된다.
(2) pop
pop은 스택에서 데이터를 꺼내는 연산이다.
가장 마지막에 들어온 데이터가 먼저 제거되고 반환된다.
(3) peek
peek는 스택의 가장 위에 있는 데이터를 확인하는 연산이다.
데이터를 제거하지 않고 현재 top 값을 확인할 때 사용한다.
(4) isEmpty
isEmpty는 스택이 비어 있는지 확인한다.
pop이나 peek를 하기 전에 데이터가 있는지 검사할 때 필요하다.
(5) isFull
isFull은 스택이 가득 찼는지 확인한다.
배열 기반 스택은 용량이 정해져 있으므로 push 전에 공간이 남아 있는지 확인해야 한다.
8 스택 구현 실습
1) Stack 클래스 구조
(1) int 배열 s
s는 스택 데이터를 저장하는 배열이다.
이 실습에서는 정수 데이터를 저장하는 스택을 직접 구현했다.
(2) capacity
capacity는 스택이 저장할 수 있는 최대 데이터 개수이다.
생성자에서 전달받은 size 값으로 정해진다.
(3) ptr
ptr은 현재 스택에 저장된 데이터 개수를 의미하면서, 다음 데이터가 들어갈 위치도 가리킨다.
push할 때는 ptr 위치에 값을 넣고 증가시키며, pop할 때는 먼저 감소시킨 뒤 값을 꺼낸다.
2) push 구현
(1) 용량 검사
push를 하기 전에 ptr이 capacity보다 크거나 같은지 확인한다.
이미 가득 찬 상태라면 더 이상 데이터를 넣을 수 없으므로 예외를 발생시킨다.
(2) 데이터 추가
공간이 있으면 s[ptr] 위치에 데이터를 저장한다.
그 후 ptr을 1 증가시켜 다음 저장 위치를 가리키게 한다.
3) pop 구현
(1) 빈 스택 검사
pop을 하기 전에 ptr이 0 이하인지 확인한다.
스택이 비어 있으면 꺼낼 데이터가 없으므로 예외를 발생시킨다.
(2) 데이터 추출
pop은 마지막에 들어간 데이터를 꺼내야 한다.
그래서 ptr을 먼저 1 감소시키고, 그 위치의 데이터를 반환한다.
4) peek 구현
(1) top 데이터 확인
peek는 스택의 가장 위 데이터를 확인한다.
현재 가장 위 데이터는 s[ptr - 1] 위치에 있다.
(2) pop과의 차이
pop은 데이터를 꺼내면서 제거하지만, peek는 확인만 한다.
따라서 peek를 호출해도 ptr 값은 변하지 않는다.
5) 보조 메소드
(1) size
size는 현재 스택에 저장된 데이터 개수를 반환한다.
ptr 값이 곧 현재 데이터 개수이다.
(2) clear
clear는 ptr을 0으로 바꿔 스택을 비운다.
배열 안의 값이 실제로 지워지는 것은 아니지만, 스택 입장에서는 저장된 데이터가 없는 상태가 된다.
(3) indexOf
indexOf는 스택 안에서 특정 값을 찾아 인덱스를 반환한다.
값을 찾으면 해당 위치를 반환하고, 없으면 -1을 반환한다.
(4) dump
dump는 스택의 바닥부터 top까지 데이터를 출력한다.
스택에 어떤 값들이 어떤 순서로 저장되어 있는지 확인할 때 사용한다.
6) 스택 테스트 흐름
(1) 데이터 추가 확인
push로 1, 2, 3, 4를 넣고 dump로 출력한다.
스택에 값이 순서대로 저장되는 것을 확인할 수 있다.
(2) peek 확인
peek를 호출하면 가장 마지막에 넣은 값인 4를 확인할 수 있다.
이때 데이터는 제거되지 않는다.
(3) pop 확인
pop을 호출하면 4가 먼저 나오고, 다음 pop에서는 3이 나온다.
이를 통해 스택이 후입선출 구조로 동작한다는 것을 확인할 수 있다.
(4) 가득 찬 상태 확인
용량이 3인 스택에 1, 2, 3을 넣으면 isFull이 true가 된다.
그 상태에서 추가로 push를 하면 용량 초과가 발생할 수 있다.
9 큐
1) 큐의 개념
(1) 큐
큐는 먼저 들어간 데이터가 먼저 나오는 자료구조이다.
선입선출 구조라고 부르며, 영어로는 FIFO라고 한다.
(2) FIFO
FIFO는 First In First Out의 줄임말이다.
먼저 들어온 데이터가 먼저 처리되는 구조이다.
(3) 큐를 사용하는 상황
대기열, 프린터 출력 순서, 작업 처리 순서처럼 먼저 들어온 요청을 먼저 처리해야 할 때 큐를 사용할 수 있다.
줄을 서서 기다리는 구조와 비슷하다.
2) 큐 주요 연산
(1) enqueue
enqueue는 큐에 데이터를 추가하는 연산이다.
새 데이터는 rear 위치에 들어간다.
(2) dequeue
dequeue는 큐에서 데이터를 꺼내는 연산이다.
가장 먼저 들어온 데이터가 있는 front 위치에서 값을 꺼낸다.
(3) peek
peek는 큐의 맨 앞 데이터를 확인하는 연산이다.
데이터를 제거하지 않고 다음에 나갈 값을 확인한다.
(4) isEmpty
isEmpty는 큐가 비어 있는지 확인한다.
dequeue나 peek 전에 데이터가 있는지 검사할 때 사용한다.
(5) isFull
isFull은 큐가 가득 찼는지 확인한다.
배열 기반 큐는 용량이 정해져 있으므로 enqueue 전에 확인할 수 있다.
10 큐 구현 실습
1) Queue 클래스 구조
(1) int 배열 q
q는 큐 데이터를 저장하는 배열이다.
이 실습에서는 정수 데이터를 저장하는 큐를 직접 구현했다.
(2) capacity
capacity는 큐에 저장할 수 있는 최대 데이터 개수이다.
생성자에서 전달받은 size 값으로 정해진다.
(3) num
num은 현재 큐에 저장된 데이터 개수이다.
enqueue하면 증가하고, dequeue하면 감소한다.
(4) front
front는 큐에서 가장 먼저 나갈 데이터의 위치를 가리킨다.
dequeue는 front 위치의 값을 꺼낸 뒤 front를 이동시킨다.
(5) rear
rear는 새 데이터가 들어갈 위치를 가리킨다.
enqueue는 rear 위치에 값을 넣고 rear를 이동시킨다.
2) 원형 큐 구조
(1) 배열의 한계
일반 배열 큐에서 데이터를 꺼내면 앞쪽 공간이 비어도 rear가 배열 끝에 도달할 수 있다.
이 경우 실제 공간은 남아 있는데 더 이상 넣지 못하는 문제가 생길 수 있다.
(2) 원형 큐
원형 큐는 배열의 끝에 도달하면 다시 0번 인덱스로 돌아가도록 만든 큐이다.
배열을 원처럼 순환해서 사용하므로 공간을 더 효율적으로 활용할 수 있다.
(3) rear 초기화
enqueue 후 rear가 capacity와 같아지면 rear를 0으로 바꾼다.
배열의 마지막 칸까지 사용한 뒤 다음 삽입 위치를 처음으로 돌리는 것이다.
(4) front 초기화
dequeue 후 front가 capacity와 같아지면 front를 0으로 바꾼다.
배열의 끝에서 데이터를 꺼낸 뒤 다음 front 위치를 처음으로 돌리는 것이다.
3) enqueue 구현
(1) 가득 찬 큐 검사
enqueue 전에 num이 capacity 이상인지 확인한다.
큐가 가득 찼다면 더 이상 데이터를 넣을 수 없으므로 예외를 발생시킨다.
(2) 데이터 추가
q[rear] 위치에 새 데이터를 저장한다.
그 후 rear를 1 증가시키고, 저장된 데이터 수인 num도 1 증가시킨다.
(3) rear 순환
rear가 배열 크기와 같아지면 0으로 바꾼다.
이를 통해 배열의 끝 다음을 다시 배열의 처음으로 연결한다.
4) dequeue 구현
(1) 빈 큐 검사
dequeue 전에 num이 0 이하인지 확인한다.
큐가 비어 있으면 꺼낼 데이터가 없으므로 예외를 발생시킨다.
(2) 데이터 추출
q[front] 위치의 값을 꺼낸다.
그 후 front를 1 증가시키고, 저장된 데이터 수인 num을 1 감소시킨다.
(3) front 순환
front가 배열 크기와 같아지면 0으로 바꾼다.
이를 통해 배열의 끝에서 다시 처음으로 이동할 수 있다.
5) peek 구현
(1) 맨 앞 데이터 확인
peek는 q[front] 값을 반환한다.
큐에서 다음에 나갈 데이터를 제거하지 않고 확인할 수 있다.
(2) dequeue와 차이
dequeue는 데이터를 꺼내면서 front와 num을 변경한다.
peek는 확인만 하므로 front와 num이 변하지 않는다.
6) 보조 메소드
(1) clear
clear는 num, front, rear를 모두 0으로 바꾼다.
큐를 초기 상태로 되돌리는 역할을 한다.
(2) getCapacity
getCapacity는 큐의 전체 용량을 반환한다.
큐가 최대 몇 개까지 저장할 수 있는지 확인할 수 있다.
(3) size
size는 현재 큐에 저장된 데이터 개수를 반환한다.
num 값이 현재 데이터 수이다.
(4) dump
dump는 큐에 저장된 데이터를 front부터 rear 방향으로 출력한다.
원형 큐에서는 실제 배열 인덱스가 끊겨 있을 수 있으므로 (i + front) % capacity 계산을 사용해 순서대로 출력한다.
7) 큐 테스트 흐름
(1) 데이터 추가 확인
enqueue로 11, 22, 33, 44를 넣고 dump로 출력한다.
큐에 데이터가 들어간 순서를 확인할 수 있다.
(2) dequeue 확인
dequeue를 호출하면 가장 먼저 넣은 11이 먼저 나온다.
다음 dequeue에서는 22가 나오므로 큐가 선입선출 구조로 동작하는 것을 확인할 수 있다.
(3) peek 확인
dequeue 후 peek를 호출하면 현재 front에 있는 데이터를 확인할 수 있다.
이 값은 제거되지 않고 그대로 큐에 남아 있다.
(4) 크기와 용량 확인
size는 현재 저장된 데이터 수를 보여주고, getCapacity는 큐의 전체 용량을 보여준다.
현재 사용량과 최대 저장 가능 수를 구분해서 확인할 수 있다.
(5) 상태 확인
isEmpty는 큐가 비었는지 확인하고, isFull은 큐가 가득 찼는지 확인한다.
clear를 호출하면 큐가 비워져 isEmpty가 true가 된다.
'멀티캠퍼스' 카테고리의 다른 글
| [2026.05.26] - TIL 37일차 웹 통신, Servlet, JSP 정리 (0) | 2026.05.27 |
|---|---|
| [2026.05.22] - TIL 36일차 정렬 알고리즘, 색인, 이진 검색 트리, 그래프 정리 (0) | 2026.05.23 |
| [2026.05.20] - TIL 34일차 JDBC MVC Member CRUD 완성 정리 (0) | 2026.05.21 |
| [2026.05.19] - TIL 33일차 JDBC MVC Product CRUD 프로젝트 정리 (0) | 2026.05.19 |
| [2026.05.18] - TIL 32일차 JDBC Template, PreparedStatement, MVC 구조 정리 (0) | 2026.05.18 |