- 오늘의 키워드
Collection, List, Queue, Set , Map
- 오늘 배운 내용 정리
- 자바에서는 배열을 더 고도화 시켜서 컬렉션이라는 이름으로 참조형 분류통(자료구조)를 제공하고 있다.
- 컬렉션은 참조형 변수만을 저장함으로써 여러기능을 많이 제공한다.
- 컬렉션에는 여러가지 종류가 있고, 이러한 컬렉션들은 데이터를 넣고 빼는 방법이 각자 다르기 때문에 용도에 맞게 사용해야한다.
- 자바의 컬렉션은 배열보다 다수의 참조형 데이터를 더 쉽고 효과적으로 처리할 수 있는 기능들을 많이 가지고 있다.
- 컬렉션 기능 : 크기 자동조정/ 추가/ 수정/ 삭제/ 반복/ 순회/ 필터 / 포함확인 등등
컬렉션 종류
1. List
순서가 있는 데이터의 집합(데이터 중복 허용) - 배열과 비슷하다.
- ArrayList
배열처럼 일렬로 데이터를 저장하고 조회하여 순번 값(인덱스)로 값을 하나씩 조회가 가능하다.
import java.util.ArrayList;
public class Col1 {
public static void main(String[] args) {
// List
// 순서가 있는 데이터의 집합 => Array(최초 길이를 알아야 함)
// 처음에 길이를 몰라도 만들 수 있음!
// 1) Array -> 정적배열
// 2) List(ArrayList) -> 동적배열(크기가 가변적으로 늘어난다)
// - 생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓는다.
// - 값이 추가될 때 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장하니깐, 상관없다!!!
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 + 생성
intList.add(99);
intList.add(15);
intList.add(3);
// System.out.println(intList.get(1));
// 2번째 있는 값(15)을 바꿔보자.
// intList.set(1, 10);
// System.out.println(intList.get(1));
System.out.println(intList.get(0));
// 삭제
intList.remove(0);
System.out.println(intList.get(0)); //0번째 데이터를 삭ㅈ
System.out.println("클리어 전");
System.out.println(intList.toString());
intList.clear(); //전체 값을 삭제한다.
System.out.println("클리어 후");
System.out.println(intList.toString());
}
}
- LinkedList
메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 담아 놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장한다.
mport java.util.LinkedList;
public class Col2 {
public static void main(String[] args) {
// linked list
// 메모리에 남는 공간을 요청해서 여기 저기 나누어서 실제 값을 담아놔요.
// 실제 값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조.
// 기본적 기능은 -> ArrayList와 동일!
// LinkedList는 값 -> 여기 저기 나누어서 : 조회하는 속도가 "느리다..."
// 값을 추가하거나, 삭제할 때는 빠릅니다.
LinkedList<Integer> linkedList = new LinkedList<Integer>(); //선언+ 생성
linkedList.add(5);
linkedList.add(7);
linkedList.add(3);
System.out.println(linkedList.get(0));
System.out.println(linkedList.get(1));
System.out.println(linkedList.get(2));
System.out.println(linkedList.toString()); // 이렇듯 조회할 때는 arraylist보다 속도가 현저히 느리다.
linkedList.add(200); //리스트에 값 200을 추가한다.
System.out.println(linkedList.toString()); //전체를 출력
linkedList.add(2, 4); //리스트의 3번째에 4를 추가한다.
System.out.println(linkedList.toString()); // 추가하거나 삭제할때는 빠르다.
linkedList.set(1, 30); // 리스트의 2번째 값을 30으로 수정한다.
System.out.println(linkedList.toString());
linkedList.remove(1); //2번째 값을 삭제
System.out.println(linkedList.toString());
linkedList.clear(); //전체 값을 제거한다.
System.out.println(linkedList.toString());
}
}
- Stack
값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리한다. LIFO(Last-in-First-out)
import java.util.Stack;
public class Col3 {
//Stack
// 수직으로 값을 쌓아놓고, 넣었다가 뺀다. FILO(Basket)
// push,peek,pop
// 최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용
public static void main(String[] args) {
Stack<Integer> intStack = new Stack<Integer>();
intStack.push(10); // 스택안에 10을넣는다.
intStack.push(15);
intStack.push(1);
// 다 지워질 때 까지 출력
while (!intStack.isEmpty()) {
System.out.println(intStack.pop()); //pop() : 맨위값을 꺼내고 삭제한다
}// 출력시 1,15,10 순으로 조회가된다.
//다시 추가
intStack.push(10);
intStack.push(15);
intStack.push(1);
//peek
System.out.println(intStack.peek()); //맨마지막에 넣은 값을 조회한다.
System.out.println(intStack.size());
}
}
2. Queue
빨대 처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합입니다. Stack과 다르게 FIFO의 성격을 띈다.
그렇기 때문에 기능이 스택과도 같으면서 다르다.
Queue 는 생성자가 없는 껍데기라서 바로 생성할수는 없습니다. (껍데기 = 인터페이스)
생성자가 존재하는 클래스인 LinkedList를 사용하여 Queue를 생성해 데이터를 받을 수 있다.
import java.util.LinkedList;
import java.util.Queue;
public class Col4 {
public static void main(String[] args) {
// Queue : FIFO
// add, peek, poll
// Queue : 생성자가 없는 인터페이스 <-
// LinkedList 를 생성하면 Queue 기능을 할 수 있다. (Queue 가 부모/ LinkedList 가 자식이기 떄문)
Queue<Integer> intQueue = new LinkedList<Integer>(); //queue를 선언, 생성
intQueue.add(1); //Queue에 맨위에 값을 추가한다.
intQueue.add(5);
intQueue.add(9);
intQueue.add(10);
while(!intQueue.isEmpty()){
System.out.println(intQueue.poll()); //poll() 맨 아래값을 꺼내고 삭제를한다.
}
// 추가
intQueue.add(1);
intQueue.add(5);
intQueue.add(9);
intQueue.add(10);
// peek
System.out.println(intQueue.peek()); // 맨아래 값을 조회한다.
System.out.println(intQueue.size()); // Queue 목록의 길이를 알아낸다.
}
}
3. Set
순서가 없는 데이터의 집합(데이터 중복 허용을 안함) - 순서없고 중복 없는 배열이다.
순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지할 수 있다.
Set은 그냥 Set으로 쓸 수도 있지만, HashSet, TreeSet등으로 응용하여 사용이 가능하다.
Set은 생성자가 없는 껍데기라 바로생성이 불가하다.
생성자가 존재하는 클래스인 HashSet을 사용하여 Set을 생성해서 받는다.
import java.util.HashSet;
import java.util.Set;
public class Col5 {
public static void main(String[] args) {
// 집합 : 순서 없고, 중복 없음!!
// 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조
// Set -> 그냥 쓸 수도 있음, 그러나, HashSet, TreeSet 등으로 응용해서 같이 사용 가능
// Set은 생성자가 없는 껍데기라서 바로 생성할 수 없음!!!!
// 생성자가 존재하는 HashSet을 이용해서 -> Set을 구현해 볼 수 있어요!!
Set<Integer> intSet =new HashSet<>(); // 선언 및 생성
intSet.add(1);
intSet.add(12);
intSet.add(5);
intSet.add(9);
intSet.add(1);
intSet.add(12);
for (Integer value : intSet) {
System.out.println(value);
} // 위에서 중복되는 값을 넣었지만 출력되는 것은 1, 5, 9, 12 뿐이다.
// contains : 포함하고 있니?
System.out.println(intSet.contains(2));
System.out.println(intSet.contains(5));
}
}
4. Map
위의 것들 과는 달리 key-value구조로 구성된 데이터를 저장한다.
key값을 기준으로 value를 조회할 수 있다.
key값 단위로 중복을 허용하지 않는 기능을 가지고 있다.
Map 은 그냥 Map으로 쓸수도있지만 HashMap, TreeMap등으로 응용하여 사용할 수 있다.
Map으로 쓸수도있지만 HashSet, TreeSet 등으로 응용하여 사용할 수 있다.
import java.util.HashMap;
import java.util.Map;
public class Col6 {
public static void main(String[] args) {
// Map : key - value pair -> 중요!!
// key라는 값으로 unique하게 보장이 되야 함!!
// Map -> HashMap, TreeMap으로 응용!
Map<String, Integer> intMap = new HashMap<>();
//키 값
intMap.put("일", 11);
intMap.put("이", 12);
intMap.put("삼", 13);
intMap.put("삼", 14); //중복 key
intMap.put("삼", 15); //중복 key
intMap.put("삼", 16); //중복 key 중복 key가 되면 맨 마지막에 넣은 값으로 덮어씌워진다.
// key 값 전체 출력(향상된 for문)
for (String key: intMap.keySet()) {
System.out.println(key);
}// 중복이 허용되지않기 때문에 key값은 일, 이, 삼 만이 출력된다.
// value 값 전체 출력(향상된 for문)
for (Integer value : intMap.values()) {
System.out.println(value);
} // 12, 11, 16 이 출력이된다.
System.out.println(intMap.get("삼")); // 맨마지막에 덮어 씌워진 16이 출력이된다.
}
}
- 오늘의 회고
언어마다 자료구조들이 특징들이 다양하여 이러한 자료구조들의 특색에 맞게 사용을 하여 좀더 효율적으로 데이터를 관리 할 수 있게 되어 최적화를 잘할 수 있도록 해야한다.
이러한 내용들을 잘 기억할 수 있고 활용할 수 있도록 까먹었을 때마다 정리한 내용을 토대로 외우도록 하고 추후 개인과제에서도 잘 써보도록 해야겠다.
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 9일차 TIL - Java 상속에 대해 알아보자 (1) | 2024.01.04 |
---|---|
내일배움 캠프 8일차 TIL - 객체 지향 언어 Java 클래스에 대해 알아보자 (1) | 2024.01.03 |
내일배움캠프 6일차 TIL - JAVA의 기본 변수타입을 기억하자 (0) | 2023.12.29 |
내일배움캠프 4일차 TIL - SQL 데이터 조회 및 엑셀 함수 적용 및 정렬 (0) | 2023.12.27 |
내일배움캠프 3일차 TIL + SQL을 기본을 다져보자 (0) | 2023.12.26 |