[Java] collection(List, Set, Map)
2024. 10. 4. 01:10ㆍJava
오늘은 collection (List, Set, Map)에 대해서 알아보자.
List
선형 자료구조, 일직선으로 이루어진 구조에 데이터를 저장한다.
- 순서 O
- 중복 허용 O
- 인덱스 O - 순서가 있으니까 인덱스도 있음
List 를 이용한 다양한 활용
import java.util.List; // 인터페이스라서 직접 생성하지는 않는다.
import java.util.ArrayList; // List 를 implements 하는 클래스
import java.util.Collections;
public class Ex01 {
public static void main(String[] args) {
// 리스트의 초기값 : size() 메서드를 사용하여 크기를 확인해보면 0
ArrayList list = new ArrayList();
System.out.println("list size : " + list.size());
// 리스트에 값을 추가하려면 add 함수 이용
// list.add(e) 함수는 리스트의 가장 마지막에 요소를 추가함
list.add(10);
list.add(20);
// 리스트 및 컬렉션은 대부분 toString()이 오버라이딩 되어있어서 바로 출력해도 내용을 확인할 수 있다
System.out.println("list : " + list);
// list.add(int index, E e) 함수는 지정한 인덱스에 값을 추가
list.add(1, 30);
System.out.println("list : " + list);
System.out.println("list size : " + list.size());
// 특정 인덱스의 값을 제거하거나, 값을 지정하여 제거할 수 있다
list.remove(0);
System.out.println("list : " + list);
System.out.println("list size : " + list.size());
// list.remove(30); 정수는 무조건 인덱스로 간주하기 때문에 에러 발생
list.remove(Integer.valueOf(30)); // Integer 객체를 전달하면 일치하는 정수 찾아서 제거
System.out.println("list : " + list);
System.out.println("list size : " + list.size());
// 리스트에서 특정 인덱스에 있는 값을 제거하지않고, 참조하기 위해서는 get(index) 를 사용
list.add(20);
list.add(30);
list.add(40);
list.add(50);
System.out.println(list);
System.out.println("list.get(0) : " + list.get(0));
System.out.println("list.get(1) : " + list.get(1));
System.out.println("list.get(2) : " + list.get(2));
// list.add 함수는 값을 추가하는데 사용하지만
// list.set(int index, E e) 함수는 지정한 위치의 값을 바꿀때 사용
list.set(0, 60);
System.out.println(list);
// 정렬함수가 내장되어있거나, 다른 클래스를 이용하여 손쉽게 정렬 가능
list.sort(null); // sort(정렬기준) ex) 점수 기준 / 이름기준
System.out.println(list);
list.add(15);
Collections.sort(list);
System.out.println(list);
// 리스트의 모든 값 한번에 비우기
list.clear();
System.out.println("list : " + list);
// 리스트가 비어있는지 확인하는 함수
System.out.println("list 가 비어있는가 : " + list.isEmpty());
// list 는 특별히 자료형을 지정하지 않으면, 내부에 Object 저장하기 때문에
// 모든 유형의 객체를 저장할 수 있다
list.add(10);
list.add("string");
list.add(3.14);
System.out.println(list);
// 특정값이 포함되어있는지 확인
System.out.println("list.contains(\"string\") : " + list.contains("string"));
}
}
출력 결과
list size : 0
list : [10, 20]
list : [10, 30, 20]
list size : 3
list : [30, 20]
list size : 2
list : [20]
list size : 1
[20, 20, 30, 40, 50]
list.get(0) : 20
list.get(1) : 20
list.get(2) : 30
[60, 20, 30, 40, 50]
[20, 30, 40, 50, 60]
[15, 20, 30, 40, 50, 60]
list : []
list 가 비어있는가 : true
[10, string, 3.14]
list.contains("string") : true
Set
주로 값의 중복을 제거하기 위해서 사용한다.
변수 이름을 별도로 가져오기 위해 사용하기도 함.
- 순서 X
- 중복 X
- 인덱스 X
- List 와 마찬가지로 Set도 인터페이스
- Set 을 구현한 HashSet 클래스 사용
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class Ex02 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
System.out.println("set size() : " + set.size());
set.add("apple"); // apple 중복 !!
set.add("apple");
set.add("banana");
System.out.println("set size() : " + set.size());
// index 가 없기 때문에 get() 함수 호출 불가능
// 향상된 for 문을 쓰자
for(String s : set) { // set 내부의 문자열을 각각 s라고 할때
System.out.println(s);
}
Iterator<String> it = set.iterator(); // 반복자 (마치 스캐너처럼 사용가능)
while(it.hasNext()) { // 순환자에서 아직 사용하지 않은 값이 남아있다면
String s = it.next(); // 그 값을 꺼내서 변수에 담은 다음
System.out.println(s); // s 를 출력
}
System.out.println();
// 이미 만들어진 컬렉션을 다른 컬렉션의 생성자에 전달하면
// 요소를 유지하면서 새로운 컬렉션을 생성
// Set 안에 있는 문자열을 그대로 새로운 List 생성에 사용하기
ArrayList<String> list = new ArrayList<>(set); // set을 list로 변경
System.out.println("list : " + list); // 데이터는 같지만 index가 생겼음
// set 은 애초에 순서가 없으니까, 정렬도 성립되지 않는다
}
}
출력 결과
set size() : 0
set size() : 2
banana
apple
banana
apple
list : [banana, apple]
Map
인덱스 대신 key 라는 값을 이용하여 value 에 접근하는 구조
- 순서 X
- key는 중복 X , value는 중복 O
- 키(key)는 값(value)에 인덱스(index)로 사용
특징 1>
key 와 value 가 1:1 맵핑되어 저장된다
특징 2>
보통 검색을 하는 목적으로 많이 사용됨
특징 3>
key를 알면 value에 접근할 수 있지만,
value 를 이용하여 역으로 key 를 알아낼 수 는 없다
key -> value (O), value -> key(X) "단방향 맵핑구조"
특징 4>
Map 은 key의 자료형과 value 의 자료형을 모두 지정해야함
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.LinkedHashMap;
import java.util.Properties;
import java.util.Scanner;
import java.util.Set;
public class Ex03 {
public static void main(String[] args) throws IOException {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("apple", "사과");
map.put("banana", "바나나");
map.put("coconut", "코코넛");
map.put("durian", "두리안");
map.put("orange", "델몬트");
System.out.println(map);
System.out.println("map.get(apple) : " + map.get("apple"));
System.out.println("map.get(사과) : " + map.get("사과"));
System.out.println();
Set<String> keySet = map.keySet(); // key는 중복 X (Set으로 받으면 됨)
for(String key : keySet) {
String value = map.get(key); // key를 알면 value를 구할 수 있다
System.out.println(key + " : " + value);
}
System.out.println();
// 다수의 데이터 중에서 원하는 값을 찾아내는 코드이지만 반복문을 사용하지 않음
Scanner sc = new Scanner(System.in);
String key;
String value;
System.out.println("맵에서 찾을 key 입력 : ");
key = sc.next();
value = map.get(key);
System.out.println(key + " : " + value);
System.out.println();
sc.close();
// 일반적으로 Map의 구현체를 사용할때는 HashMap 을 사용하지만
// 순번이 필요할때 >> LinkedHashMap 을 사용
// key와 value 가 제네릭 타입이 String && 파일에 저장하여 불러올때 >> Properties
Properties pro = new Properties();
pro.put("charAt", "인덱스를 전달하여 글자를 char형태로 반환");
pro.put("equals", "다른 문자열과 비교하여 일치여부를 boolean 타입으로 반환");
pro.put("contains", "특정 패턴의 내용이 포함되는지를 boolean 타입으로 반환");
pro.put("substring", "인덱스를 지정하여 특정 범위의 문자열을 잘라냄");
pro.put("split", "특정 글자를 기준으로 각 내용을 분리하여 String[]으로 반환");
pro.put("replace", "특정 패턴 글자를 찾아서, 새로운 내용으로 교체");
for(Object k : pro.keySet()) {
Object v = pro.get(k);
System.out.println(k + " : " + v);
}
System.out.println();
// Map의 또다른 용도 : pro.txt 라는 텍스트 파일생성
File f = new File("pro.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
pro.store(osw, "String Class Function");
}
}
출력 결과
{apple=사과, banana=바나나, coconut=코코넛, durian=두리안, orange=델몬트}
map.get(apple) : 사과
map.get(사과) : null
apple : 사과
banana : 바나나
coconut : 코코넛
durian : 두리안
orange : 델몬트
맵에서 찾을 key 입력 :
banana (= 사용자 입력값 )
banana : 바나나
contains : 특정 패턴의 내용이 포함되는지를 boolean 타입으로 반환
split : 특정 글자를 기준으로 각 내용을 분리하여 String[]으로 반환
equals : 다른 문자열과 비교하여 일치여부를 boolean 타입으로 반환
replace : 특정 패턴 글자를 찾아서, 새로운 내용으로 교체
charAt : 인덱스를 전달하여 글자를 char형태로 반환
substring : 인덱스를 지정하여 특정 범위의 문자열을 잘라냄
// 프로젝트 내부에 pro.txt 라는 파일이 생긴다
많은 데이터를 다루기 위해서는 매번 자료형과 변수를 지정해주는 방법보다는
collection을 이용하여 한번에 생성하는 편이 좋다
컬렉션은 자료형을 신경쓰지 않아도 되기 때문에 편하다.
'Java' 카테고리의 다른 글
[Java] 자바의 조건문 if ~ else, switch case (0) | 2024.10.04 |
---|---|
[Java] Array - 중복 제거된 난수 생성하기 feat.로또번호 (0) | 2024.10.04 |
[Java] 페이징(paging) 처리 알고리즘 (1) | 2024.10.04 |
[Java] 변수의 종류 (0) | 2024.10.03 |
[Java] Java, 객체지향 언어 (0) | 2023.12.13 |