39일차 - 2023.2.20

문우림·2023년 2월 20일
0

Java

목록 보기
20/23

1. 컬렉션 프레임워크(collection)


표 참조

  • 자료구조 및 알고리즘을 구현해 놓은 일종의 라이브러리.
  • 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)하기 위해서 사용하는 라이브러 리.

📍컬렉션 프레임워크(구현 클래스)들은 데이터들을 담는 그릇이라는 점에서는 동일하지만 성격(특징)에 따라 다양한 클래스(인터페이스)들이 존재한다.

📍가장 기본이 되는 CollectionIterator인터페이스를 상속받고 있고, add(), size(), iterator() 메소드를 가지고 있다.

1-1. Collection인터페이스에서 정의한 List와 Set인터페이스의 공통된 메소드

메소드설명
boolean add(E e)해당 컬렉션에 전달된 요소를 추가함.(선택적 기능)
void clear()해당 컬렉션의 모든 요소를 제거함.(선택적 기능)
boolean contains(Object o)해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인
boolean equals(Object o)해당 컬렉션과 전달된 객체가 같은지를 확인
boolean isEmpty()해당 컬레션이 비어있는지를 확인
Iterator< E > iterator()해당 컬렉션의 반복자(iterator)를 반환
boolean remove(Object o)해당 컬렉션에서 전달된 객체를 제거(선택적 기능)
int size()해당 컬렉션의 요소의 총 갯수를 반환
Object[] toArray()해당 컬렉션의 모든 요소를 Object타입의 배열로 반환

같은 메소드여도 클래스마다 조금씩 기능이 다르다.

1-2. 주요 인터페이스

Collection인터페이스를 상속받는 대표적인 인터페이스들이 Set / List / Que
Map도 조요 인터페이스.
이들을 구현하는 클래스들(ArrayList, HashSet등)이 자료구조에 속한다.

List< E > (Collection)
List인터페이스를 구현하는 클래스들은 인덱스 순서에 따라 데이터가 저장되고 데이터의 중복 저장이 가능.

Set< E > (Collection)
Set인터페이스를 구현하는 클래스들은 순서를 유지하지 않고 데이터를 저장하며 중복된 데이터의 저장이 불가능.

Map<K, V>
Map인터페이스를 구현하는 클래스들은 키(Key)와 값(Value)을 동시에 저장한다.(즉, 키를 통해 값을 불러온다) 이때 키는 중복이 불가능하다.

2. List< E >

List< E >인터페이스를 구현하는 대표적인 클래스 ➡ ArrayList< E > / LinkedList< E >

📌List클래스의 특정 메소드

메소드설명
void add(int index, Element)주어진 인덱스에 객체를 추가.
set(int index, Element)주어진 인덱스에 저장된 객체를 주어진 객체로 바꾼다.
E get(int index)주어진 인덱스에 저장된 객체를 리턴.
E remove(int index)주어진 인덱스에 저장된 객체를 삭제.

📌공통 특성

  • 인스턴스의 저장 순서 유지
  • 동일 인스턴스의 중복 저장을 허용한다.

2-1. ArrayList< E > 클래스

  • 배열 기반 자료구조
  • 배열을 이용하여 인스턴스 저장
import java.util.*;

public class ArrayListTest {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();

		list.add("Toy");
		list.add("Box");
		list.add("Robot");

		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();

		list.remove(0);

		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();
	}

}

  • 배열 기반 자료구조이지만 공간의 확보 및 확장은 ArrayList 인스턴스가 스스로 처리한다.

2-2. LinkedList< E > 클래스

  • 리스트 기반 자료구조
  • 인스턴스의 값과 다음 객체를 참조할 수 있는 주소값이 들어가 있는 리스트

List<String> list = new LinkedList<>(); 유일한 변화❗

import java.util.*;

public class LinkedListTest {

	public static void main(String[] args) {
		List<String> list = new LinkedList<>();

		// 인스턴스 저장
		list.add("Toy");
		list.add("Box");
		list.add("Robot");

		// 인스턴스 참조
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();

		// 첫 번째 인스턴스 삭제
		list.remove(0);

		// 첫 번째 인스턴스 삭제 후 나머지 인스턴스를 참조
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + '\t');
		}
		System.out.println();
	}

}

LinkedList의 구조(예제)

import java.util.*;

class TestLinkedList {
	int num;
	TestLinkedList linked; // 데이터 타입이 TestLinkedList인 주소 참조
}

public class LinketListTest {

	public static void main(String[] args) {
		TestLinkedList link1 = new TestLinkedList();
		link1.num = 1;
		System.out.println(link1);

		TestLinkedList link2 = new TestLinkedList();
		link1.num = 2;
		link1.linked = link2; // LinkedList 적용
		System.out.println(link2);
	}
}

2-3. 저장된 인스턴스의 순차적 접근 방법1

📌for-each문

for (String s : list) {
			System.out.print(s + '\t');
		}

2-4. 저장된 인스턴스의 순차적 접근 방법2

📌Iterator 반복자
자바 컬렉션 프레임워크에 속해있는 인터페이스 중 하나.
Iterator를 구현한 클래스는 컬렉션 객체를 탐색, 데이터 접근, 삭제 할 수 있다.

Iterator<데이터타입> iterator명 = 컬렉션.iterator();

for(Iterator<String> itr = list.iterator(); itr.hasNext();) {
			System.out.println(itr.next() + '\t');
		}

📌Iterator인터페이스의 메소드

메소드설명
boolean hasNext()읽어 올 요소가 있는지 확인한다. 있으면 true / 없으면 false 반환
Object next()다음 요소(값) 읽어오기.(hasNext()로 확인 후 사용하는 것이 안전)
void remove()next()시 가져온 값, 읽어온 요소 삭제하기.(next()로 읽어온 후 사용해야 함)

참조

3. ArrayList< E >와 LinkedList< E >의 장단점

3-1. ArrayList< E >

장점

  • 특정 요소에 접근하는 속도가 빠르다.
  • 저장된 인스턴스의 참조가 빠르다.

단점

  • 저장공간을 늘리는 과정이 복잡하다.
  • 인스턴스 삭제 과정도 복잡하다.

📌사용법

  • 배열내 요소에 랜덤으로 접근하여하고, 배열내의 요소를 추가 / 삭제 할 필요가 적을 때

3-2. LinkedList< E >

장점

  • 요소를 추가하고 삭제하는 과정이 간단하다.

단점

  • 저장된 인스턴스를 순차적으로 참조하기 때문에 특정 요소에 접근하는데 시간이 걸린다.

📌사용법

  • 배열내 요소에 랜덤으로 접근할 필요가 없고, 배열내의 요소를 추가 / 삭제를 자주 할 때.

3-3. 둘의 차이

컬렉션접근 시간추가/삭제비교
ArrayList빠르다느리다순차적 추가/삭제는 더 빠르다.메모리를 비효율적으로 쓴다.
LinkedList느리다빠르다데이터가 많을수록 접근성이 떨어진다.

참조

0개의 댓글