profile image

L o a d i n g . . .

컬렉션 프레임워크?
- 컬렉션 (객체의 저장) + 프레임워크(사용방법을 정해둔 라이브러리)
- 자바가 널리 알려져 있는 자료구조를 사용해 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현클래스를 java.util패키지에서 제공하는 것들
- 컬렉션 프레임워크의 주요 인터페이스로 List, Set, Map이 있다

List

- 배열과 비슷하게 객체를 인덱스로 관리한다.
- 배열과의 차이점은 저장용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여됨
- 리스트 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조
- 동일한 객체를 중복 저장할 시 동일한 번지를 참조
- null또한 저장이 가능하나, 객체를 참조하지 않는 인덱스

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

기능 메소드 설명
객체 추가 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) 주어진 객체 삭제

인덱스로 객체를 관리하게 때문에 인덱스를 매개값으로 갖는 메소드가 많다
E >> 저장되는 객체의 타입을 List 컬렉션 생성 시 결정하라는 의미


ArrayList

import java.util.List;

public class ArrayListEx {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		
		list.add("Java");
		list.add("JDBC");
		list.add("Servlet/JSP");
		list.add(2, "Database");
		list.add("iBATIS");
		
		int size = list.size();
		System.out.println("총 객체 수: " + size);
		System.err.println();
		
		String skill = list.get(2);
		System.out.println("2: "+ skill);
		System.out.println();
		
		for (int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ": " + str);
		}
		System.out.println();
		
		list.remove(2);
		list.remove(2);
		list.remove("iBATIS");
		for (int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ": " + str);
		}
	}
}

0번 인덱스부터 차례로 저장되고 삭제시 1씩 당겨지기때문에 빈번한 객체삭제와 삽입이 일어나는 곳에서는 바람직하지 않다. 대신 순차적으로 추가하고 삭제하거나, 검색시에는 빠르다.




Vector

package a220813;

import java.util.List;
import java.util.Vector;

public class VectorEx {
	public static void main(String[] args) {
		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.add(new Board("제목5", "내용5", "글쓴이5"));
		
		list.remove(2);
		list.remove(3);
		
		for (int i = 0; i < list.size(); i++) {
			Board board = list.get(i);
			System.out.printf("%s	%s	%s	%n", board.subject, board.content, board.writer);
		}
	}
}

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

어레이리스트와 동일한 내부구조를 가지고 있으나 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고 하나의 스레드가 메소드를 실행을 완료해야만 다른 스레드가 실행할 수 있다.
때문에 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다




LinkedList

package a220813;

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

public class LinkedListEx {
	public static void main(String[] args) {
		List<String> list1 = new ArrayList<String>();
		List<String> list2 = new LinkedList<String>();
		
		long startTime;
		long endTime;
		
		startTime = System.nanoTime();
		for (int i = 0; i < 10000; i++) {
			list1.add(0, String.valueOf(i));
		}
		endTime = System.nanoTime();
		System.out.println("ArrayList 걸린시간: " + (endTime - startTime) + " ns");
		
		startTime = System.nanoTime();
		for (int i = 0; i < 10000; i++) {
			list2.add(0, String.valueOf(i));
		}
		endTime = System.nanoTime();
		System.out.println("LinkedList 걸린시간: " + (endTime - startTime) + " ns");
	}
}

특정 인덱스 객체 제거시 앞 뒤 링크만 변경되고, 나머지 링크는 변경이 없다. (당겨지지X) 때문에 중간에 추가/삭제시 ArrayList에 비해 훨씬 빠르다









Set

List컬렉션은 객체의 저장순서를 유지하지만 Set은 유지되지 않는다. 객체중복이 불가하며 하나의 null만 저장이 가능하다

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 저장. (boolean으로 리턴)
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 조사
boolean isEmpty() 컬렉션이 비어있는지 조사
Iterator<E> iterator() 저장된 객체를 한 번씩 가져오는 반복자를 리턴
int size() 저장되어 있는 전체 객체수를 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

Set 컬렉션은 인덱스롤 객체를 검색해서 가져오는 메소드가 없는 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자를 제공한다.

반복자는 Iterator 인터페이스를 구현한 객체를 말하며 iterator()메소드를 호출하면 얻을 수 있다.

리턴타입 메소드 설명
boolean hasNext() 가져올 객체가 있으면 true 아니면 false
E next() 컬렉션에서 하나의 객체를 가져옴
void remove() Set 컬렉션에서 객체를 제거





Hashset

package a220813;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetEx {
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		
		set.add("Java");
		set.add("JDBC");
		set.add("Servlet/JSP");
		set.add("Java");
		set.add("iBATIS");
		
		int size = set.size();
		System.out.println("총 객체수: " + size);
		
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			String element = iterator.next();
			System.out.println("\t" + element);
		}
		
		set.remove("JDBC");
		set.remove("iBATIS");
		
		System.out.println("총 객체수: " + set.size());
		
		iterator = set.iterator();
		for(String element : set) {
			System.err.println("\t" + element);
		}
		set.clear();
		
		if (set.isEmpty()) {
			System.out.println("비어 있음");
		}
	}
}

객체들을 순서없이 저장하고 동일객체는 중복저장하지 않음
hashCode()메소드를 호출해서 해시코드를 얻어낸 후 이미 저장되어 있는 객체들의 해시코드와 비교해서 동일한 해시코드가 있다면 equls()메소드로 두 객체를 비교해 중복저장을 막는




























참고 :
- 혼자 공부하는 자바(신용권), 한빛미디어






반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] 입출력 스트림  (0) 2022.08.16
[Java] 컬렉션 프레임워크 - Map  (0) 2022.08.14
[Java] 스레드 제어  (0) 2022.07.27
[Java] 멀티 스레드2  (0) 2022.07.26
[Java] 멀티 스레드 1  (0) 2022.07.25
복사했습니다!