today_is
[ collection ] 본문
오늘의 목표
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
주로 값의 중복 제거하기 위해 사용한다
변수이름을 별도로 가져오기 위해 사용하기도 한다
- 순서 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 라는 파일이 생긴다
study_review
많은 데이터를 다루기 위해서는 매번 자료형과 변수를 지정해주는 방법보다는
컬렉션을 이용하여 한번에 생성하는 편이 좋다
컬렉션은 자료형을 신경쓰지 않아도 되기 때문에 편하다.
정리
종류 | List | Set | Map |
순서 유무 | O | X | X |
중복 여부 | O | X | key 중복 X , value 중복 O |
인덱스 유무 | O | X | key는 value의 인덱스로 사용 |
'java' 카테고리의 다른 글
[ loop ] for, while 반복문 (0) | 2023.11.20 |
---|---|
[ control ] if ~ else , switch case (0) | 2023.11.17 |
[ array ] 중복 제거한 난수 생성하기 (로또번호 추첨) (0) | 2023.11.16 |
[ java ] 페이징(paging) 알고리즘 (0) | 2023.11.07 |
[ java ] 객체지향 언어, java (0) | 2023.11.03 |