본문 바로가기
  • Coding & Book
학습단/JAVA 학습단

17. 혼공자 17일차(컬렉션 프레임 워크)

by 루이3 2023. 8. 7.

컬렉션 프레임 워크

  • 자바에서 자료구조를 사용해서 객체들을 효율적으로 추가, 검색, 삭제 할수 있도록
    인터페이스와 구현 클래스를 java.util 패키지에서 제공하는데 이들을 컬렉션 프레임워크라고 부릅니다.
  • 컬렉션은 객체의 저장, 프레임워크는 사용 방법을 정해놓은 라이브러리를 말합니다.
  • 컬렉션 프레임 워크의 주요 인터페이스로는 List, Set, Map이 있습니다.

 

List 컬렉션

  • 배열과 비슷하게 객체를 인덱스로 관리합니다.
  • 배열과의 차이점은 저장 용량이 자동으로 증가하고 객체를 저장할때 자동으로 인덱스가 부여됩니다.
  • List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조합니다.
  • List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있습니다.

 

List 컬렉션에서 공통적으로 사용가능한  List 인터페이스 메소드

  • E 라는 타입 파라미터는 저장되는 객체의 타입을 List 컬렉션을 생성할 때 결정하라는 뜻입니다.
  • 예시로 아래 코드와 같이 변수를 선언하였을때 List 컬렉션에 저장되는 객체를 String 타입으로 하겠다는 뜻이고
    E 타입 파라미터는 String 타입이 됩니다.
List<String> list = ...;

 

 

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index,E element) 주어딘 인덱스에 객체를 추가
E set(int index, E element) 주어진 인덱스에 저장된 객체를
주어진 객체로 변경
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 조사
E get(int index) 주어진 인덱스에 저장된 객체를 리턴
boolean isEmpty() 컬렉션이 비어 있는지 조사
int size() 저장되어 있는 전테 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체 삭제
E remove(int index) 주어진 인덱스에 저장된 객체 삭제
boolean remove(Object o) 주어진 객체 삭제

 

ArrayList

  • ArrayList는 List 인터페이스의 대표적인 구현 클래스입니다.
  • 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 됩니다.
  • ArrayList를 생성하기 위해서는 저장할 객체타입을 E 파라미터 자리에 표기하고 기본 생성자를 호출하면 됩니다.
  • 빈번한 객체 삭제 혹은 삽입이 일어나는곳에는 사용하지 않는 것이 좋습니다.
    (한개가 제거되면 뒤 인덱스들이 당겨지기 때문입니다.)
List<E> list = new ArrayList<E>();

List<String> list = new ArrayList<String>();

 

예시 코드)

package sec15.exam01;
import java.util.*;

public class ArrayListExample {

	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		
		list.add("Hi");
		list.add("Hello");
		
		int size = list.size();
		
		list.remove(0);
		list.add(1, "Java");
		System.out.println("총 갯수: " + size);
		for(int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			System.out.println(str);
		}
	}

}

 

 

Vector

  • ArrayList와 동일한 내부구조를 가지고 있습니다.
  • Vetor는 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 Vetor의 메소드들을 실행 할수 없고,
    하나의 스레드가 메서드를 실행을 완료 해야만 다른 스레드가 메소드를 실행할수 있습니다.
List<E> list = new Vector<E>();

 

VectorExample.java 파일

package sec15.exam01;

import java.util.*;

public class VectorExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Board> list = new Vector<Board>();
		
		list.add(new Board("제목1", "언어1", "저자1"));
		list.add(new Board("제목2", "언어2", "저자2"));
		list.add(new Board("제목3", "언어3", "저자3"));
		list.add(new Board("제목4", "언어4", "저자4"));
		
		list.remove(0);
		list.remove(2);
		
		for(int i=0; i<list.size(); i++) {
			Board board = list.get(i);
			System.out.println(board.subject + "," + board.lan + "," + board.writer);
		}
	}

}

Board.java 파일

package sec15.exam01;

	public class Board {
		String subject;
		String lan;
		String writer;
	
	
	public Board(String subject, String lan, String writer) {
		this.subject = subject;
		this.lan = lan;
		this.writer = writer;
	}
}

주의할점으로 remove(0) 에서 제목 1부분이 사라지고 제목 2부분이 당겨집니다.

따라서 remove(2)를 하게 될경우 제목3 부분이 안사라지고 제목4 부분이 사라집니다.

 

LinkedList

  • ArrayList 와 사용방법은 똑같지만 내부구조는 다릅니다.
  • LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않습니다.
  • 특정 인덱스에 객체를 삽입할 때에도 마찬가지입니다.
  • ArrayList보다 순차적으로 추가나 삭제, 검색은 느리지만 중간에 추가하거나 삭제하는것은 빠릅니다.
List<E> list = new LinkedList<E>();