today_is

[ collection ] 본문

java

[ collection ]

ye_rang 2023. 11. 16. 20:27

오늘의 목표 

 

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의
인덱스로 사용