Java

Java 문법) 컬렉션 프레임워크 - List 컬렉션

sejin2 2023. 11. 3. 14:51

컬렉션 프레임 워크란?

 : 자료구조를 사용해서 객체들을 효율적으로 관리할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에서

  제공하는 것을 총 칭하는 말

  java.util 패키지에 포함

  인터페이스를 통해 다양한 컬렉션 클래스 이용

  • 컬렉션 : 객체의 저장
  • 프레임워크 : 사용 방법을 정해 놓은 라이브러리
기능 메서드 설명
요소 추가 boolean add(E element) 리스트의 끝에 요소(element) 추가
  void add(int index, E element) 주어진 위치(index)에 요소(element) 삽입
  set(int index, E element) 주어진 인덱스의 개체를 새로운 객체로 바꿈
요소 검색 E get(int index) 지정된 위치(index)에 있는 요소를 반환
  boolean Contains(Object o) 주어진 객체가 저장되어 있는지 여부
  isEmpty( ) 컬렉션이 비어있는지 조사
  int size( ) 저장되어 있는 전체 객체 수를 리턴
요소 삭제 E remove(int index) 주어진 위치(index)에 있는 요소를 삭제하고, 삭제된 요소를 반환
  boolean remove(Object o) 주어진 객체를 리스트에서 삭제
  void clear( ) 저장된 모든 객체를 삭제

List 컬렉션

: 객체를 인덱스로 관리, 저장 용량이 자동으로 증가하며 객체 저장 시 자동 인덱스가 부여

  추가, 삭제, 검색을 위한 다양한 메서드 제공

  객체 자체를 저장하는 것이 아닌 객체 주소 참조

  객체의 순서를 유지하여 저장, 중복 저장 가능

1. ArrayList

: 저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어남. 고정도 가능.

객체 제거 : 제거된 객체 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 앞당겨 짐

** 배열의 문제점 : 저장할 수 있는 객체 수가 배열을 생성할 때 결정, 객체 삭제했을 때 인덱스가 비게 됨

    ( 객체를 저장하려면 어디가 비어있는지 확인해야 함 )

import java.util.ArrayList;
import java.util.List;

import javax.management.openmbean.ArrayType;

public class ArrayList01 {
	public static void main(String[] args) {
		// ArrayList<>
		// <제네릭> -> 자료형이 무엇이 들어올지 모른다. 사용할 때 자료형을 넣는다
		// 			 개수를 지정하지 않으면 기본 10개
		 
		// 개수 지정 가능 
		ArrayList<String> List = new ArrayList<>(15);
		// 부모형으로 변환하여 사용
		List<String> list = new ArrayList<>();
		list.add("Java");
		list.add("Oracle");
		list.add("HTML5");
		list.add("JSP");
		
		int size = list.size();
		System.out.println("총 객체 수 : " + size);
		
		String list_21 = list.get(2);
		System.out.println(list_21); 
		
		// add : 삽입
		list.add(2, "Spring");	
		System.out.println("총 객체 수 : " + list.size());
		System.out.println(list.get(2)); 
		
		// set : 대체 ( 기존 객체 변경 )
		list.set(2, "SringBoot");
		System.out.println("총 객체 수 : " + list.size());
		System.out.println(list.get(2));
		System.out.println("-----------");
		
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println("-----------");
		
		// 삭제 remove(index), remove(객체명)
		String removeStr = list.remove(0);
		System.out.println(removeStr);
		System.out.println();
		
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		}
		System.out.println();
		
		boolean re = list.remove("HTML5");
		System.out.println(re);
		
		list.clear();
		System.out.println("총 객체 수 : " + list.size());
		System.out.println("ArrayList가 비어있는가? " + list.isEmpty());
		
		// 매개변수에 모든 객체를 받을 때 <Object>
		ArrayList alist2 = new ArrayList();
		
		alist2.add(1);
		alist2.add(3.1415);
		alist2.add("56");
		alist2.add(new String("88"));
		
		Object obj1 = alist2.get(0);
		int num = (int)obj1;
		double douNum = (double)alist2.get(1);
		int strNum1 = Integer.parseInt((String)alist2.get(2));
		int strNum2 = Integer.parseInt((String)alist2.get(3));
		System.out.println(num + douNum + strNum1 + strNum2);
		
	}
}

출력결과 

2. Vector

: 사용은 ArrayList와 동일

동기화 된 메서드로 구성되어 있어, 멀티 스레드가 동시에 Vector( ) 메서드를 실행할 수 없음

import java.util.Vector;

public class Vector02 { 
	public static void main(String[] args) {
		Vector<String> vlist = new Vector<>();
		vlist.add("Vector");
		vlist.add("ArrayList");
		
		vlist.remove(0);
		vlist.remove("ArrayList"); 
	}  
}

3. LinkedList

: ArrayList와 사용 방법은 동일하나 내부 구조는 다름

인접 참조를 링크해서 체인처럼 관리 ( 이중 연결 리스트(doubly linked list) 로 구현 )

각 요소가 이전 요소와 다음 요소에 대한 참조를 가지고 있는 자료 구조

LinkedList 클래스는 List 인터페이스를 구현하며, 순서가 있는 요소를 저장하고 관리함

  • 맨 앞(Head): 리스트의 첫 번째 요소, 즉 가장 앞쪽에 위치한 요소로 이 요소는 리스트의 시작 지점을 가리키며, getFirst() 메서드로 접근
  • 맨 뒤(Tail): 리스트의 마지막 요소, 즉 가장 뒤쪽에 위치한 요소로 이 요소는 리스트의 끝 지점을 가리키며, getLast() 메서드로 접근

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedList03 { 
	public static void main(String[] args) {
		LinkedList<Integer> list = new LinkedList<Integer>();
		
		list.add(3);		// 맨 끝에 추가 
		list.add(1, 5); 	// index 1번에 추가
		list.addFirst(1);	// 맨 앞에 추가 
		list.add(7);
		
		for (int i : list)
			System.out.println(i);
		System.out.println("------------");
		
		list.remove();	// 맨 앞 노드 삭제 
		for (int i : list)
			System.out.println(i);
		
		list.remove(1);
		list.removeLast();	// 맨 끝 노드 삭제
		//list.remove(list.size() -1);	// 맨 끝 노드 삭제 
		System.out.println("------------");
		
		list.add(5);
		list.add(7);
		list.add(9);
		list.add(11);
		
		// Iterator는 컬렉션을 순회하고 접근하는데 사용되는 인터페이스 
		Iterator<Integer> it = list.iterator(); 
		// hesNext() => 남아있는 객체가 있는가 ? 남아있는게 있으면 true 반환, 없으면 false 반환
		// next() => 순회하면서 값 얻어오기
		
		while(it.hasNext()) {
			int num = it.next();
			System.out.println(num);
		} 
	} 
}