[Java] 기초 문법 - 컬렉션 (Collection)

2023. 8. 16. 23:55·개발 ━━━━━/Java
반응형

컬렉션 (Collection)

컬렉션의 종류로는

List, Set, Queue, Map 이 있다.

 

List 순서가 있는 데이터의 집합 (데이터 중복 허용, 배열과 비슷)
Queue 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 추출할 수 있는 집합
FIFO (First In First Out)
Set 순서가 없는 데이터의 집합 (데이터 중복 허용 안함, 순서, 중복이 없는 배열)
Map 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합 (Key 값 중복 허용 안함)

컬렉션은 참조형 변수를 저장한다. (Integer, Long, Double, String)

 

List

ArrayList

- 배열처럼 일렬로 데이터를 저장하고 조회하여 인덱스로 값을 하나씩 조회한다.

- 배열처럼 크기가 정해져 있지 않고 필요할 때마다 크기가 점점 늘어난다.

 

Array 메모리에 연속된 공간을 요청한 사이즈만큼 받아서 실제 값을 저장하는 기본형 변수로 저장 -> 정적 배열
ArrayList 작은 연속된 공간을 요청해서 참조형 변수들을 담아 놓고, 값이 추가될 때 더 큰 공간이 필요하면 공간을 받아서 저장 -> 동적 배열

 

// 선언
ArrayList<Integer> intList

// 생성
new ArrayList<Integer>();

// 초기화 - 사이즈를 지정하지 않기 때문에 필요x

// 값 추가
intList.add({추가할 값})

// 값 수정
intList.set({수정할 순번}, {수정할 값})

// 값 삭제
intList.remove({삭제할 순번})

// 전체 출력
intList.toString()

// 전체 제거
intList.clear()
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 및 생성
		
		intList.add(1);
		intList.add(2);
		intList.add(3);
		
		System.out.println(intList.get(0)); // 1 출력
		System.out.println(intList.get(1)); // 2 출력
		System.out.println(intList.get(2)); // 3 출력
		System.out.println(intList.toString()); // [1,2,3] 출력
		
		intList.set(1, 10); // 1번순번의 값을 10으로 수정
		System.out.println(intList.get(1)); // 10 출력
		
		intList.remove(1); // 1번순번의 값을 삭제
		System.out.println(intList.toString()); // [1,3] 출력
		
		intList.clear(); // 전체 값을 삭제
		System.out.println(intList.toString()); // [] 출력
	}
}

 

Linked List

- 노드끼리의 주소 포인터를 서로 가리키며 링크(참조)함으로써 이어지는 구조

- 값을 추가, 삭제시 ArrayList 보다 빠르지만, 조회하는 속도는 느리다.

 

// 선언
LinkedList<Integer> linkedList

// 생성
new LinkedList<Integer>();

// 초기화 - 사이즈를 지정하지 않기 때문에 필요x

// 값 추가
linkedList.add({추가할 값})

// 값 중간에 추가
linkedList.add({추가할 순번}, {추가할 값})

// 값 수정
linkedList.set({수정할 순번}, {수정할 값})

// 값 삭제
linkedList.remove({삭제할 순번})

// 전체 출력
linkedList.toString()

// 전체 제거
linkedList.clear()
import java.util.LinkedList;

public class Main {

	public static void main(String[] args) {
		LinkedList<Integer> linkedList = new LinkedList<>(); // 선언 및 생성

		linkedList.add(1);
		linkedList.add(2);
		linkedList.add(3);

		System.out.println(linkedList.get(0)); // 1 출력
		System.out.println(linkedList.get(1)); // 2 출력
		System.out.println(linkedList.get(2)); // 3 출력
		System.out.println(linkedList.toString()); // [1,2,3] 출력 (속도 느림)

		linkedList.add(2, 4); // 2번 순번에 4 값을 추가
		System.out.println(linkedList); // [1,2,4,3] 출력

		linkedList.set(1, 10); // 1번순번의 값을 10으로 수정
		System.out.println(linkedList.get(1)); // 10 출력

		linkedList.remove(1); // 1번순번의 값을 삭제
		System.out.println(linkedList); // [1,4,3] 출력

		linkedList.clear(); // 전체 값을 삭제
		System.out.println(linkedList); // [] 출력
	}
}

 

Stack

- 상자에 물건을 쌓아 올리듯이 데이터를 쌓는 자료구조

- LIFO (Last In First Out) 의 형태

 

// 선언
Stack<Integer> intStack

// 생성
new Stack<Integer>();

// 추가
intStack.push({추가할 값})

// 조회
intStack.peek()

// 꺼내기
intStack.pop()
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		Stack<Integer> intStack = new Stack<Integer>(); // 선언 및 생성
		
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 3,2,1 출력
		}

		// 다시 추가
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);
		
		// peek()
		System.out.println(intStack.peek()); // 3 출력
		System.out.println(intStack.size()); // 3 출력 (peek() - 맨 윗값 확인만)
		
		// pop()
		System.out.println(intStack.pop()); // 3 출력
		System.out.println(intStack.size()); // 2 출력 (pop() - 맨 윗값 삭제)		
		
		System.out.println(intStack.pop()); // 2 출력
		System.out.println(intStack.size()); // 1 출력 (pop() - 맨 윗값 삭제)	

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 1 출력 (마지막 남은거 하나)
		}
	}
}

 

Queue

- 생성자가 존재하는 클래스인 LinkedList 를 사용하여 Queue 를 생성할 수 있다.

- FIFO (First In First Out) 의 형태

 

// 선언
Queue<Integer> intQueue

// 생성
new LinkedList<Integer>();

// 추가
intQueue.add({추가할 값})

// 조회
intQueue.peek()

// 꺼내기
intQueue.poll()
import java.util.LinkedList;
import java.util.Queue;

public class Main {

	public static void main(String[] args) {
		Queue<Integer> intQueue = new LinkedList<>(); // 선언 및 생성

		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 1,2,3 출력
		}

		// 다시 추가
		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		// peek()
		System.out.println(intQueue.peek()); // 1 출력 (맨 먼저 들어간값이 1 이라서)
		System.out.println(intQueue.size()); // 3 출력 (peek() - 맨 아래값 확인만)

		// poll()
		System.out.println(intQueue.poll()); // 1 출력
		System.out.println(intQueue.size()); // 2 출력 (poll() - 맨 아래값 삭제)

		System.out.println(intQueue.poll()); // 2 출력
		System.out.println(intQueue.size()); // 1 출력 (poll()  - 맨 아래값 삭제)

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 3 출력 (마지막 남은거 하나)
		}
	}
}

 

Set

- 순서, 중복이 없는 데이터의 집합

- 생성자가 존재하는 클래스인 HashSet 을 사용하여 Set 을 생성하여 받을 수 있다.

 

// 선언
Set<Integer> intSet

// 생성
new HashSet<Integer>();

// 추가
intSet.add({추가할 값})

// 조회
intSet.get({초회할 순번})

// 삭제
intSet.remove({삭제할 값})

// 포함확인
intSet.contains({포함확인 할 값})
// boolean 값으로 리턴
import java.util.HashSet;
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		Set<Integer> intSet = new HashSet<Integer>(); // 선언 및 생성

		intSet.add(1);
		intSet.add(2);
		intSet.add(3);
		intSet.add(3); // 중복된 값은 덮어씀
		intSet.add(3); // 중복된 값은 덮어씀

		for (Integer value : intSet) {
			System.out.println(value); // 1,2,3 출력
		}

		// contains()
		System.out.println(intSet.contains(2)); // true 출력
		System.out.println(intSet.contains(4)); // false 출력

		// remove()
		intSet.remove(3); // 3 삭제

		for (Integer value : intSet) {
			System.out.println(value); // 1,2 출력
		}
	}
}

 

* HashSet 이외에도 다른 Set 사용 가능

HashSet 가장 빠르며 순서를 전혀 예측할 수 없음
TreeSet 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
LinkedHashSet 추가된 순서, 가장 최근에 접근한 순서대로 접근 가능

보통 HashSet 을 사용하지만 순서 보장이 필요하면 LinkedHashSet 을 사용한다.

 

Map

- Key-Value 구조로 구성된 데이터 저장 가능

- Key 값을 기준으로 value 조회 가능 (Key 값은 중복되지 않음)

 

// 선언
Map<String, Integer> intMap

// 생성
new HashMap<>();

// 추가
intMap.put({추가할 Key값},{추가할 Value값})

// 조회
intMap.get({조회할 Key값}) // Key에 있는 Value값을 조회

// 전체 key 조회
intMap.keySet()

// 전체 value 조회
intMap.values()

// 삭제
intMap.remove({삭제할 Key값}) // Key에 있는 Value값을 삭제
import java.util.Map;

public class Main {

	public static void main(String[] args) {
		Map<String, Integer> intMap = new HashMap<>(); // 선언 및 생성

		//          키 , 값
		intMap.put("일", 11);
		intMap.put("이", 12);
		intMap.put("삼", 13);
		intMap.put("삼", 14); // 중복 Key값은 덮어씀
		intMap.put("삼", 15); // 중복 Key값은 덮어씀

		// key 값 전체 출력
		for (String key : intMap.keySet()) {
			System.out.println(key); // 일,이,삼 출력
		}

		// value 값 전체 출력
		for (Integer key : intMap.values()) {
			System.out.println(key); // 11,12,15 출력
		}

		// get()
		System.out.println(intMap.get("삼")); // 15 출력
	}
}

* HashSet 이외에도 TreeMap 사용 가능

HashMap 중복을 허용하지 않고 순서를 보장하지 않음, 키와 값으로 null 허용
TreeMap key 값을 기준으로 정렬 가능. 단, 오름차순으로 정렬하기 때문에 시간이 다소 소요된다.

 

반응형

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

[Java] 객체 지향 - 상속, 오버라이딩  (1) 2023.08.24
[Java] 객체 지향 - 클래스, 인스턴스, 생성자  (1) 2023.08.19
[Java] 기초 문법 - 배열  (0) 2023.08.16
[Java] Input 값 입력 받는 방법 ① - Scanner 클래스  (0) 2023.08.16
[Java] 기초 문법 - 조건문, 반복문  (0) 2023.08.15
'개발 ━━━━━/Java' 카테고리의 다른 글
  • [Java] 객체 지향 - 상속, 오버라이딩
  • [Java] 객체 지향 - 클래스, 인스턴스, 생성자
  • [Java] 기초 문법 - 배열
  • [Java] Input 값 입력 받는 방법 ① - Scanner 클래스
GukJang
GukJang
•  ⌘ ⌥ •
    반응형
  • GukJang
    SPACE
    GukJang
  • 전체
    오늘
    어제
    • Blog (73)
      • 개발 ━━━━━ (68)
        • Java (14)
        • C++ (1)
        • HTML (1)
        • Spring(boot) (7)
        • Dev (9)
        • SQL (1)
        • CS (2)
        • Git (1)
        • Troubleshoot (14)
        • Algorithm (2)
        • Definition (1)
        • Dev Life (2)
        • TIL (7)
        • 항해 (6)
      • 공돌 ━━━━━ (4)
        • 플젝 (2)
        • 장비 (1)
        • 부품 (1)
      • 독서 ━━━━━ (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    mysql
    AWS
    micropython
    항해99
    spring
    github actions
    Java
    오픈소스 기여
    EC2
    CI CD
    SpringBoot
    자바
    Python
    사전 스터디
    알고리즘
    docker volume
    백준
    docker
    마이크로파이썬
    electron-builder
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
GukJang
[Java] 기초 문법 - 컬렉션 (Collection)
상단으로

티스토리툴바