Java

[Java] Collection

wwxs 2024. 9. 12. 16:51

자바 컬렉션 프레임워크

  • 데이터를 저장하고 처리하는 자료구조의 표준화된 설계

컬렉션 프레임워크 사용 방법

  • 데이터의 특성에 맞는 클래스 선택
  • 데이터의 중복에 대한 필요성, 순서 유지에 대한 필요성 점검
  • 키-값 쌍 데이터의 필요성

 

컬렉션 프레임워크의 주요 인터페이스

 

1. Collection

  • 자바 컬렉션 프레임워크의 상위 인터페이스, 데이터의 집합을 다룸

2. List

  • 데이터의 순서를 유지, 중복 허용 (ArrayList, LinkedList 등)

List 인터페이스

  • 데이터를 순차적으로 저장하고 접근하는데 사용하는 메서드를 정의
  • 데이터의 중복 저장을 허용, 저장된 순서에 따라 데이터를 관리

List의 특징

  • 요소의 인덱스를 통한 정확한 위치 지정
  • 요소의 중복 허용
  • 다양한 구현체를 통해 사용 가능

List 인터페이스 구현 클래스

  • ArrayList: 내부적으로 배열을 사용하여 데이터를 관리
    • 1. 동적 크기를 조절 
      • 요소가 추가되거나 제거될 때 자동으로 크기를 조절
    • 2. 인덱스 기반 접근
      • 특정 위치의 데이터를 빠르게 읽거나 수정 가능
      • 중간에 데이터를 삽입하거나 삭제하는 작업은 비교적 느림
    • 3. 순차적인 데이터 저장, 중복 데이터 허용
    • 4. 널(Null) 값을 허용
  • 데이터를 빠르게 조회할 때 사용 (데이터의 삽입, 삭제 제외)
  • null 값을 허용, null 값이 허용될 수 있는 상황에서는 null 체크를 항상

 

LinkedList

  • 내부적으로 이중 연결 리스트를 사용하여 데이터를 관리
    • 1. 동적 크기 조절
      • 자동으로 크기 조절
    • 2. 데이터 삽입 / 삭제 호출
      • 특정 위치에서의 요소 추가 / 삭제가 빠름
      • 특정 위치의 요소에 접근하는 것은 리스트를 순회해야 하기 때문에 속도가 비교적 느림
    • 3. 널(Null) 값을 허용, null 값이 허용될 수 있는 상황에서는 null 체크를 항상 동반

 

(List 인터페이스의 주요 메서드와 사용 예제)

더보기
		== List 인터페이스의 주요 메서드 ==
		 - add(E e) : 리스트의 끝에 요소를 추가
		 - add(int index, E e) : 지정된 위치에 요소를 추가
		 - get(int index) : 저장된 위치의 요소를 반환
		 - remove(int index) : 지정된 위치의 요소를 제거하고, 그 요소를 반환
		 - size() : 리스트의 크기(요소의 수)를 반환
		 - clear() : 리스트의  모든 요소를 제거
		 - indexof(Object o) : 지정된 요소가 처음으로 나타나는 위치의 인덱스를 반환
		 - contains(Object o) : 리스트가 특정 요소를 포함하는지 여부를 반환
		 - set(int index, E e) : 지정된 위치에 주어진 요소를 저장, 이전에 있던 요소를 반환

 

// 1. ArrayList 사용 예시
		System.out.println("=== ArrayList ===");
		
		// - new 생성자를 사용하여 ArrayList 객체를 생성
		// >> 일반 데이터 타입X, 클래스 객체 데이터 타입
		// EX) String, Number, Boolean 등
		
		// 컬렉션명 <객체데이터타입> 변수명 = new 컬렉션명<>();
		ArrayList<String> strArray = new ArrayList<String>();
		
		System.out.println(strArray.size());  // 0
		
		strArray.add("JAVA");
		strArray.add("PYTHON");
		strArray.add("JS");
		strArray.add("TS");
		System.out.println(strArray.size());  // 4
		System.out.println(strArray);	// [JAVA, PYTHON, JS, TS]
		
		strArray.add(1, "REACT");
		System.out.println(strArray);	// [JAVA, REACT, PYTHON, JS, TS]
		
		String element = strArray.get(1);
		System.out.println(element);	// REACT
		
		System.out.println(strArray.remove(1));	// REACT
		System.out.println(strArray);	// [JAVA, PYTHON, JS, TS]
			
		System.out.println(strArray.set(1, "C++"));	// PYTHON
		System.out.println(strArray);	// [JAVA, C++, JS, TS]
		
		
		// 2. LinkedList 사용 예시
		System.out.println("=== LinkedList ===");
		LinkedList<String> linkedList = new LinkedList<String>();
		
		linkedList.add("Apple");
		linkedList.add("Banana");
		linkedList.add("Orange");
		
		System.out.println(linkedList);	// [Apple, Banana, Orange]
		
		linkedList.add(1, "Mango");
		System.out.println(linkedList);	// [Apple, Mango, Banana, Orange]
		
		String fruitElement = linkedList.get(2);
		System.out.println(fruitElement); 	// Banana
		
		String isFruits1 = "Orange";
		String isFruits2 = "Strawberry";
		
		System.out.println(linkedList.contains(isFruits1));	// true
		System.out.println(linkedList.contains(isFruits2));	// false
		
		linkedList.clear();
		System.out.println(linkedList);	// []

 

List 컬렉션 프레임워크 사용 시 유의 사항

  • get, remove, set 메서드(인덱스 번호를 사용하는 메서드) 사용 시 인덱스 번호가 유효한지 검사

 

ArrayList VS LinkedList

 

1. 정의 & 특징

(1) ArrayList

  • 내부적으로 배열을 사용하여 요소를 저장
  • 요소를 읽는 것 빠름 / 요소를 추가, 삭제 하는 것은 느림

(2) LinkedList

  • 내부적으로 이중 연결 배열을 사용하여 요소를 저장
  • 요소를 추가하거나 삭제하는 것 빠름 / 요소를 읽는 것은 느림

2. 저장 구조

(1) ArrayList

  • 요소의 추가 및 삭제 시 요소를 이동시켜야 함
  • 인덱스를 통한 접근은 빠르다

(2) LinkedList

  • 옆의 요소와 연결만 변경하면 추가, 삭제가 가능
  • 처음부터 요소를 순회해야해서 느리다

 


3. set

  • 데이터의 순서를 유지 X, 중복 허용 X (HashSet, TreeSet 등)

Set 인터페이스

  • 중복된 요소를 포함하지 않는 객체의 집합
  • 객체의 저장 순서를 저장하지 X (삽입 순서 유지 X)
  • null 요소 포함 가능

Set 컬렉션 종류

1. HashSet

  • 가장 많이 사용되는 Set 구현체, 빠른 성능을 제공
  • 삽입 순서나 요소의 정렬 상태를 보장 X

2. LinkedHashSet

  • HashSet 에서 순서를 추가한 형태
  • 요소를 삽입 순서대로 유지

3. TreeSet

  • 요소의 순서가 중요하거나 요소를 정렬된 상태로 유지해야 할 때 사용
  • 자동 정렬

(Set 인터페이스의 주요 메서드와 사용 예제)

더보기
// Set 컬렉션의 주요 메서드
// add, remove, contains, size
// isEmpty: Set이 비워져 있는지 확인

// == HashSet 클래스 선언 방법 ==
// Set<E> set명 = new HashSet<E>();

 

public class D_Set {
	public static void main(String[] args) {

		Set<String> set = new HashSet<String>();

		set.add("자바");
		set.add("파이썬");
		set.add("C++");
		set.add("자바스크립트");
		
		System.out.println(set);	// [C++, 파이썬, 자바, 자바스크립트]
		
		set.remove("자바");
		System.out.println(set);	// [C++, 파이썬, 자바스크립트]
		
		set.add("C++");
		System.out.println(set);	// [C++, 파이썬, 자바스크립트]
		
		System.out.println(set.size());  // 3
		
		System.out.println(set.contains("자바스크립트"));	// true
		
		set.clear();
		System.out.println(set.size());	// 0
		System.out.println(set.isEmpty());	// true
		
	}
}

 


4. Map

  • 키-값 쌍으로 이루어진 데이터를 다룸, 키는 중복 허용 X, 값은 중복 허용 O (HashMap, TreeMap 등)

Map 인터페이스

  • 키(key)와 값(value)의 쌍으로 요소를 저장하는 데이터 구조
  • 키는 고유한 데이터(하나의 값)를 가짐

Map의 주요 특징

  • 키의 유일성
  • 값의 중복성
  • 순서 보장 X (LinkedHashMap은 순서 보장 O)

1. HashMap

  • 해시 테이블을 사용하여 키-값 쌍을 저장
  • 순서 유지 X (작업 시간 빠름)
  • null 허용(키, 값 모두 허용)

2. LinkedHashMap

  • 삽입 순서를 유지
  • 삽입 순서가 중요하고 빠른 검색이 필요할 때 주로 사용

3. TreeMap

  • 키-값 쌍을 트리에 저장, 키에 따라 정렬
  • 키에 null 값 허용

 

(Map 인터페이스의 주요 메서드와 사용 예제)

더보기
// Map 인터페이스 메서드
		
// put(K key, V value) : 키와 값을 Map에 추가
// get(Object key) : 지정된 키에 매핑된 '값'을 반환
// remove(Object key) : 주어진 키와 연관된 키-값 쌍 삭제(반환)
// containsKey(Object key) : 주어진 키가 Map에 있는지 확인하여 boolean으로 반환
// keySet() : Map의 키 셋을 반환
// values() : Map의 값 컬렉션을 반환
// entrySet() : Map의 키-값 쌍을 나타내는 Set을 반환

 

public class E_Map {
	public static void main(String[] args) {
   		 Map<String, Integer> students = new HashMap<String, Integer>();
		// 이름(키), 나이(값)
		
		students.put("홍동현", 25);
		students.put("홍길동", 30);
		students.put("김재혁", 22);
		
		System.out.println(students);	// {김재혁=22, 홍동현=25, 홍길동=30}
		
		System.out.println(students.get("홍길동"));	// 30
		
		students.remove("홍동현");
		System.out.println(students);	// {김재혁=22, 홍길동=30}
		
		System.out.println(students.containsKey("홍길동"));	// true
		System.out.println(students.containsKey("최영재"));	// false
		
		System.out.println(students.size());	// 2
		
		System.out.println(students.keySet());	// [김재혁, 홍길동]
		System.out.println(students.values());	// [22, 30]

	}
}