오늘은 List 인터페이스 및 Stack과 Queue에 대해서 공부해보았다.
ArrayList와 Vector는 객체 배열 클래스이다.
Vector는 자바 2부터 제공된 클래스라고 하는데, 학원에서도 배우지 않아서 생소하다.
일반적으로는 ArrayList를 더 많이 사용한다고 한다.
Vector는 멀티 쓰레드 프로그램에서 동기화를 지원한다.
동기화(Synchronization)란 두개의 쓰레드가 동시에 하나의 리소스에 접근할 때 순서를 맞추어서 데이터의 오류가 방지하지 않도록 하는 것이다.
capacity와 size는 다른의미이다.
Stack은 List In First Out(LIFO)의 형태를 가지고 있다.
즉, 맨 마지막에 추가 된 요소가 가장 먼저 꺼내지는 자료구조이다.
이미 구현된 클래스가 제공된다.
ArrayList나 LinkedList로 구현할 수 있다.
게임에서 무르기, 최근 자료 가져오기 등에 구현된다.
아래는 스택을 실제 코드로 구현한 것이다.
A B C 순서로 입력된 스택에서 pop()함수를 사용하여 꺼내면 C B A 순서로 출력되는 것을 볼 수 있다.
<추가공부>
Stack 과 Queue
자바에서 제공하는 Stack과 Queue에 대해서 알아보기 이전에 스택(stack)과 큐(queue)의 기본 개념과 특징에 대해서 먼저 이야기해보겠습니다.
스택(Stack)은 마지막에 저장되어 있는 데이터를 가장 먼저 꺼내는 후입선출(LIFO)방식이고, 큐는 먼저 들어간 데이터를 먼저 꺼내는 선입선출(FIFO)방식입니다.
예를 들어서 1,2,3 순서대로 데이터를 넣었다면
스택(Stack)은 3,2,1 순으로 먼저 들어간 데이터가 나중에 나오게 되고
큐(Queue)는 1,2,3 순으로 먼저 들어간 데이터가 먼저 나오게 됩니다.
* Stack과 Queue 메서드
- Stack
메서드 |
설명 |
|
boolean empty() |
Stack이 비어있는지 알려준다. |
|
Object peek() |
stack의 맨 위에 저장된 객체를 반환, pop()과 달리 Stack에서 객체를 꺼내지는 않음(비었을 때는 EmptyStackException 발생) |
|
Object pop() |
Stack의 맨 위에 저장된 객체를 꺼낸다. |
|
Object push(Object item) |
Stack에 객체(item)를 저장한다. |
|
int search(Object o) |
Stack에서 주어진 객체(o)를 찾어서 그 위치를 반환, 못찾으면 -1을 반환 (배열과 달리 위치는 0이 아닌 1부터 시작) |
- Queue
메서드 |
설명 |
|
boolean add(Object o) |
지정된 객체를 Queue에 추가한다. 성공하면 true를 반환 저장공간이 부족하면 illegalStateException발생 |
|
Object remove() |
Queue에서 객체를 꺼내 반환 비어있으면 NoSuchElementException 발생 |
|
Object element() |
삭제없이 요소를 읽어온다. peek와 달리 Queue가 비었을 때 NoSuchElementException발생 |
|
boolean offer(Object o) |
Queue에 객체를 저장. 성공하면 true, 실패하면 false를 반환 |
|
Object poll() |
Queue에 객체를 꺼내서 반환, 비어있으면 null을 반환 |
|
Object peek() |
삭제없이 요소를 읽어 온다. Queue가 비어있으면 null을 반환 |
Stack과 Queue의 예제
// queue와 stack 예제 package study1; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class Stack_Queue { public static void main(String[] args) { Stack st = new Stack<>(); Queue q= new LinkedList(); st.push("1"); st.push("2"); st.push("3"); q.offer("1"); q.offer("2"); q.offer("3"); System.out.println("= Stack ="); while(!st.isEmpty()) { System.out.println(st.pop()); } System.out.println("= Queue ="); while(!q.isEmpty()) { System.out.println(q.poll()); } } }
stack과 queue의 결과가 다르게 나옴을 알 수 있었습니다.
즉, Stack의 경우는 후입선출(LIFO)방식으로 인해서
1,2,3 -> 3,2,1순으로 데이터가 출력이 되었지만
Queue의 경우는 1,2,3 -> 1,2,3순으로 데이터가 출력이 됩니다.
* Stack과 Queue 활용
자료구조 |
활용 |
|
스택 |
수식계산,수식괄호검사, 웹브라우저의 뒤로/앞으로 |
|
큐 |
최근사용문서, 버퍼(buffer) |
1. stack 연산
1.1. String 값을 입력 받은 후에 '('와 ')'의 값에 따라서 stack의 변화를 다르게 줍니다.
1.2. 만약 '('을 입력받으면 스택에 추가합니다.
1.3. 만약 ')'을 입력받으면 스택의 맨 윗부분의 값이 '('일 경우에만 pop()을 시켜줍니다.
package study1; import java.util.EmptyStackException; import java.util.Stack; public class Stack_Queue { public static void main(String[] args) { Stack<Character> st = new Stack(); String name = "((2+3)*1+3)"; System.out.println("name:"+name); try { for(int i=0; i<name.length(); i++) { char ch = name.charAt(i); if(ch=='(') { st.push('('); }else if(ch==')' && st.peek() == '(') { st.pop(); } } if(st.isEmpty()) { System.out.println("괄호가 일치합니다"); }else { System.out.println("괄호가 일치하지 않습니다."); } }catch(EmptyStackException e){ System.out.println("괄호가 일치하지 않습니다."); } } }
2. queue 연산
1. 도움말 프로그램
1.1 문자열을 입력받습니다.
1.2 만약 문자열이 "q"이면 프로그램을 종료시킵니다.
1.3 만약 문자열이 "help"이면 도움말을 출력합니다.
1.4 만약 문자열이 "history"이면 지금까지 입력했던 명령어를 출력해줄 수 있습니다.
1.5 저 3가지 경우가 아니면 문자열을 큐에 저장합니다.
1.5.1 저장할 떄 큐의 크기가 최대 문자열이 들어갈 길이보다 클 경우 큐에서 값을 빼냅니다.
package practice; import java.util.LinkedList; import java.util.ListIterator; import java.util.Queue; import java.util.Scanner; public class que { public static Queue q = new LinkedList(); public static int MAX_SIZE = 5; // Queue에 최대 5개까지만 저장되도록 합니다. public static void save(String input) { if(!"".equals(input)) { q.offer(input); } if(q.size() > MAX_SIZE) { q.remove(); } } public static void main(String[] args) { System.out.println("help를 입력하면 도움말을 볼 수 있습니다."); while(true) { System.out.print(">>"); try { Scanner sc = new Scanner(System.in); // 문자열의 좌우 공백을 제거하는 함수 String input = sc.nextLine().trim(); if("".equals(input))continue; if(input.equalsIgnoreCase("q")) { //정상 종료 System.exit(0); }else if(input.equalsIgnoreCase("help")) { System.out.println(" help - 도움말을 보여줍니다."); System.out.println(" q 또는 Q - 프로그램을 종료합니다."); System.out.println(" history - 최근에 입력한 명령어를 "+MAX_SIZE+"개 보여줍니다."); }else if(input.equalsIgnoreCase("history")) { int i=0; // 입력받은 명령어를 저장 save(input); LinkedList tmp = (LinkedList)q; ListIterator it = tmp.listIterator(); while(it.hasNext()) { System.out.println(++i+"."+it.next()); } }else { save(input); } }catch(Exception e) { System.out.println("입력 오류입니다."); } } } }
출처: https://blog.naver.com/thdwlsgus0/222005928979
패스트캠퍼스 강의:
'언어공부 > JAVA&SPRING' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 17회차 미션 (0) | 2020.08.26 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 16회차 미션 (0) | 2020.08.25 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 14회차 미션 (0) | 2020.08.23 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 13회차 미션 (0) | 2020.08.22 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 12회차 미션 (0) | 2020.08.21 |
댓글