- 컬렉션 프레임워크
: 컬렉션을 다루기 위한 표준화된 프로그래밍 방식 , 쉽고 편리하게 다룰 수 있는 다양한 클래스 제공
-> 유지보수, 편리
- 컬렉션 : 여러객체의 모음
- 프레임워크 : 표준화, 정형화된 체계적 프로그래밍 방식
- 컬렉션 프레임웍의 핵심 인터페이스 : List, Set, Map
① List : 순서가 있는 데이터 집합, 중복 가능
② Set : 순서, 중복이 없음
③ Map : key와 value의 pair --> 순서유지 안하며, key는 중복x, value는 중복o
1.-1) List- ArrayList
① List 인터페이스를 구현하기 때문에 순서유지, 중복 가능
② Vector를 개선한 클래스로 비슷함
③ Object배열을 이용하서 데이터를 순차적으로 저장
* 배열의 크기는 변경할 수 없기 때문에 크기 변경이 될 때마다 새로운 배열 생성 후 -> 복사 - > 참조변경필요
- 장점 : 구조간단, 빠른 접근시간
- 단점 : 크기변경 불가, 중간에 데이터 추가 또는 삭제에 시간 소요 큼(순차적일때는 빠름)
아래는 코드별 그림(자바의정석 Ex11_1)
1.-2) List- LinkedList
: 배열의 단점을 보완하기 위해 고안
-> 연속된 요소를 불연속으로 바꿔 데이터를 서로 연결하는 형태이다.
때문에 next에 있는 참조만 변경하면 중간 노드 삭제가 가능하고, 또 참조에 새로운 주소를 넣으면 추가도 가능하다.
** 순차적으로 추가/삭제하는 경우 ArrayList가 빠르다.
** 중간에 데이터를 추가/삭제하는 경우 LinkedList가 빠르다.
** 접근시간은 ArrayList가 빠르다.
- Stack 과 Queue
- Stack : 마지막에 저장한 데이터를 가장 먼저 꺼내는 LIFO(Last In First Out) 구조
- Queue : 처음에 저장한 데이터를 가정 먼저 꺼내는 FIFO(First In First Out) 구조
- 그림으로살펴보면 ,
Stack 의 저장 순서 : 0 - 1 - 2 / 추출 순서 : 2 - 1 - 0
Queue의 저장 순서 : 0 - 1- 2 / 추출 순서 : 0 - 1 - 2
- Stack : 중간에 삽입이 불가능하고 순차적으로 배열되어 있으므로, ArrayList 컬렉션 클래스에 적합
- Queue : 데이터의 추가. 삭제가 쉬운 ArrayLinked 컬렉션 클래스가 적합
- stack 예제 (자바의 정석 Ex11_9)
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
public class Ex11_09 {
public static Stack back = new Stack();
public static Stack forward = new Stack();
public static void main(String[] args) {
goURL("1.네이버");
goURL("2.네이트");
goURL("3.다음");
goURL("4.구글");
printStatus();
goBack();
System.out.println("='뒤로' 가기 버튼 누른 후 =");
printStatus();
goBack();
System.out.println("='뒤로' 가기 버튼 누른 후 =");
printStatus();
goForward();
System.out.println("='앞으로' 가기 버튼 누른 후 =");
printStatus();
goURL("codechobo.com");
System.out.println("= 새로운 주소 누른 후 =");
printStatus();
}
public static void printStatus() {
System.out.println("back :" + back);
System.out.println("forward : "+ forward);
System.out.println("현재화면은 " + back.peek() + " 입니다.");
System.out.println();
}
public static void goURL(String url) {
back.push(url);
if(!forward.empty())
forward.clear();
}
public static void goForward() {
if(!forward.empty())
back.push(forward.pop());
}
public static void goBack() {
if(!back.empty())
forward.push(back.pop());
}
}
그림으로 살펴보면, 아래와 같다.
이와같이 가장 마지막에 넣은 객체를 가장 먼저 반환하는 스택 구조는 웹브라우저의 뒤로/앞으로, 수식 괄호검사 등에서 활용한다.
- queue 예제 (자바의 정석 Ex11_11)
import java.util.*
static Queue q = new LinkedList();
static final int MAX_SIZE = 5;
public static void main(String[] args) {
System.out.println("help를 입력하시면 도움말을 볼 수 있습니다. ");
while(true) {
System.out.print(">>");
try {
//화면으로부터 라인단위로 입력받기
Scanner s =new Scanner(System.in);
String input = s.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 or Q - 프로그램을 종료합니다. ");
System.out.println(" history - 최근에 입력한 검색어를 "+ MAX_SIZE + "개 보여줍니다.");
} else if (input.equalsIgnoreCase("history")) {
int i =0;
//입력받은 명령어 저장
save(input);
//LinkedList 내용 보여준다.
LinkedList tmp = (LinkedList)q;
ListIterator it = tmp.listIterator();
while(it.hasNext())
System.out.println(++i+"."+it.next());
} else {
save(input);
System.out.println(input);
}
} catch (Exception e) {
System.out.println("입력오류");
}
}
}
public static void save(String input) {
if(!"".equals(input))
q.offer(input);
if(q.size() > MAX_SIZE)
q.remove();
}
}
그림으로 살펴보면 아래와 같다.
이와 같이 Queue는 처음에 저장된 값이 처음에 추출되므로 지정된 범위 안에서 확인가능한 최근사용문서, 인쇄작업 대기목록 등에서 활용한다.
참고 : 자바의정석(남궁성)
'JAVA' 카테고리의 다른 글
JAVA_제네릭, 열거형, 애너테이션 (0) | 2021.08.07 |
---|---|
JAVA_컬렉션 프레임워크(Set, Map) (0) | 2021.08.06 |
JAVA_날짜와 시간 (0) | 2021.08.04 |
JAVA_예외처리 (0) | 2021.08.03 |
JAVA_인터페이스 (0) | 2021.08.02 |
댓글