본문 바로가기
JAVA

JAVA_컬렉션 프레임워크(List)

by haheaven 2021. 8. 5.

 

 

 

-  컬렉션 프레임워크

 : 컬렉션을 다루기 위한 표준화된 프로그래밍 방식 , 쉽고 편리하게 다룰 수 있는 다양한 클래스 제공 

 -> 유지보수, 편리

- 컬렉션 : 여러객체의 모음

- 프레임워크 : 표준화, 정형화된 체계적 프로그래밍 방식

 

- 컬렉션 프레임웍의 핵심 인터페이스 : 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

댓글