본문 바로가기
JAVA

Collection API: List, Set, Map

by EUN-JI 2023. 8. 30.

컬렉션 API : 대량의 Data를 묶어서 관리하는 클래스들.

 

★List,  ★Set,  ★ Map  = interface임 ( 인터페이스 직접new로 객체생성 불가능.) 

:곧바로 객체생성 불가 /  실제 코드 구현은 각 인터페이스를 구현한 자식클래스들을 사용

1.   List 순서대로 저장 인덱스번호 중복Data 허용
2.   Set 순서 X 인덱스 X 중복 X
3.   Map 순서X key key    중복   X
    value value  중복  O

★List★ : 가장 많이 사용됨.

List인터페이스를 구현한 하위 클래스를 사용 <제네릭>을 이용하여 배열요소 타입 지정.

 

: ArrayList

:LinkedList

:Vector

 

★Set★

 

:HashSet

:TreeSet

:LinkedHashSet

 

★Map★

 

:HashMap

:TreeMap

:LinkedMap

:HashTable

import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;

public class CollectionsClassTest {

	public static void main(String[] args) {
		//Collections 클래스의 유용한 static(객체없이 쓸수 있는 기능메소드)메소드
		//1) Collections.sort()
		//2) Collections.shuffle()
		
		ArrayList<String> datas = new ArrayList<String>(); 
		datas.add("nice");
		datas.add("World");
		datas.add("Hello");
		datas.add("Android");
		datas.add("hello");
		datas.add("nice");
		datas.add("good");
		System.out.println(datas.toString());
		
		System.out.println();
		
			Collections.sort(datas);  //리스트객체 요소들이 정렬됨.
			System.out.println(datas.toString());
		
		
			Collections.shuffle(datas);  //요소의 위치가 랜덤하게 섞임
			System.out.println(datas.toString());
	}
}
-------------------------------------------------------------------------------------------
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

public class ListTest {

	public static void main(String[] args) {
		
		//Collection 클래스들 : 자료구조를 구현한 Java API글래스들 -대량의 데이터를 관리
		
		//배열과 차이점 있음.
		//배열은 새로운 데이터의 추각, 삭제 등의 작업이 다소 번거롭다.
		//데이터의 추가, 삭제, 변경, 정렬 등의 작업을 편하게 해주기 위해 만들어진 클래스들이 Collection임.
		
		//컬렉션은 저장 방법론에 따라 크게 3가지 종류로 구분됨.
		
		//1. List  : 자료가 저장된 순서대로 있음. 자동부여된 인덱스번호로 구분함. 중복된 값 가질 수 있음.
		//2. Set   : 순서X, 인덱스 번호X , 중복 데이터X
		//3. Map   : 순서X, 인덱스 번호대신에 식별자(key)를 사용함. 중복 key는 허용X, 중복 Data는 허용.
		
		//위 3종류 모두 인터페이스여서 곧바로 객체생성이 불가능.
		// 실제 코드 구현은 .. 각 인터페이스를 구현한 자식 클래스들을 사용하는 것임. 
		//1) List : ArrayList, LinkedList, Vector
		//2) Set  : HashSet, TreeSet, LinkedHashSet
		//3) Map  : HashMap, TreeMap, LinkedMap, HashTable
		
		
		//가장 많이 사용하는 List계열 부터 실습해보기.
		
		//List는 인터페이스이기에 직접 new로 객체생성이 불가능.
		//List list= new List();   /error
		
		//List인터페이스를 구현한 하위 클래스를 사용 - 제네릭<>을 이용하여 배열요소의 타입을 지정
		ArrayList<String> aaa=new ArrayList<String>();
		
		//List계열의 객체들이 가지고 있는 유용한 기능메소드들..
		
		//1. 요소의 개수**
		int size= aaa.size();
		System.out.println("요소 개수: " + size);
		
		//2. 요소의 추가**
		String s= new String("aa");
		aaa.add(s);
		aaa.add(new String("bb"));
		aaa.add("cc");  //자동 new String()
		
		System.out.println("요소 개수: " + aaa.size());
		
		//3. 요소를 얻어오기**
		String ss =aaa.get(0);
		System.out.println(ss);
		System.out.println(aaa.get(1));
		System.out.println(aaa.get(2));
		// System.out.println(aaa.get(3));  //Exception(예외)발생 
		
		//4. 요소 삭제하기 **
		aaa.remove(1);
		System.out.println("요소 개수 : " + aaa.size());
		System.out.println(aaa.get(0));
		System.out.println(aaa.get(1));
		//System.out.println(aaa.get(2)); //error
		
		//5. 특정 위치에 추가하기
		aaa.add(1, new String("dd"));
		System.out.println(aaa.get(0));
		System.out.println(aaa.get(1));
		System.out.println(aaa.get(2));
		
		//6. 제거할 때 인덱스 번호가 아닌 객체 참조변수로 제거 가능
		String s2= new String("Test");
		aaa.add(s2);
		System.out.println("요소 개수 : " + aaa.size());
		aaa.remove(s2);   //주소를 가져온것 
		System.out.println("요소 개수 : " + aaa.size());
		
		//7. 요소 모두 제거하기
		aaa.clear();
		System.out.println("요소 개수 : " + aaa.size());
		
		//8. 중복 데이터의 허용 알아보기
		aaa.add("aa");
		aaa.add("aa");
		aaa.add("aa");
		System.out.println(aaa.get(0));
		System.out.println(aaa.get(1));
		System.out.println(aaa.get(2));
		
		//9. 요소의 비교 관련 기능들.
		//aaa.clear();   /true
		System.out.println(aaa.isEmpty());  //false   //비어 있는지 여부
		System.out.println(aaa.contains("aa"));   //true // "aa"가 포함되어 있는지 여부
		System.out.println(aaa.contains("bb"));    //false //bb 포함여부
		
		//10. 한번에 여러요소를 추가하기 
		aaa.clear();
		aaa.add("aa");
		aaa.add("bb");
		aaa.add("cc");
		
		//다른 리스트있어야 함.
		ArrayList<String> bbb= new ArrayList<String>();
		bbb.add("kk");
		bbb.add("ss");
		
		aaa.addAll(bbb);
		System.out.println(aaa.toString()); //요소들을 [,,,,,]모양의 문자열로 출력(편의기능임.)
		//개발자의 편의기능임. 실무에선 안씀. 
		
		//10.1 특정위치에 한번에 추가하기
		aaa.addAll(1,bbb);
		System.out.println(aaa.toString());
		
		// 위 addAll 처럼 .removeAll(), containsAll()도 존재함.
		
		//11. List계열에만 있는 기능
		System.out.println(aaa.indexOf("cc"));    //위치까지 알려줌. 
		System.out.println(aaa.indexOf("tt"));   //못찾으면 마이너스 -1
		
		//요소의 값을 순차적으로 얻어오기...
		//방법1. for문 사용하기  **(0번부터~ 몇번까지 )
		for(int i=0; i<aaa.size(); i++) {
			String t= aaa.get(i);
			
			System.out.println(t);
		}
		System.out.println();
		
		//방법2. 확장된 for문법  **(무조건 0번부터~끝번까지)- 다른 언어에서는 for each문법이라고 부름
		for(String t : aaa) {
			System.out.println(t);
		}
		System.out.println();
		
		//방법3. iterator()[반복자]를 이용하는 방법 .. Set수업에서 소개
		
		
		//List계열의 또 다른 하위 클래스들.  사용법 똑같음. 단, 성능이 다름.
		//ArrayList차이점 -요소의 빈번한 추가/ 제거시에 속도가 빠름. 단, 요소의 접근이 오래걸릴수 있음.
		LinkedList<String> ccc= new LinkedList<String>();
		ccc.add(new String("aaa"));
		ccc.add("bbb");
		ccc.add("ccc");
		
		ccc.remove(1);
		System.out.println(ccc.toString());
		
		//Vector   =  ArrayList와 다 똑같음... 단, 동기화 처리(Thread수업에 소개)가 되어 있음.
		Vector<String> ddd= new Vector<String>();
		ddd.add("aaa");
		ddd.remove(0);
		
		//<>제네릭에는 기본자료형은 불가능.
		//혹시 int형을 여러개 리스트에 저장하고 싶다면? Wrapper클래스 사용
		ArrayList<Integer> eee=new ArrayList<Integer>();
		eee.add(10);
		eee.add(20);
		System.out.println(eee.toString());
		//당연하게 개발자가 만든 class도 제네릭에 사용가능함
		ArrayList<Person> people = new ArrayList<Person>();
		people.add(new Person());
		people.add(new Person());
		people.add(new Person());
		
		people.get(0).name="sam";
		people.get(0).age= 20;
		people.get(0).show();   // ArrayList.person.체이닝기법 
	}
}

class Person{
	String name;
	int age;
	void show() {
		System.out.println(name+ "," + age);
	}
}
--------------------------------------------------------------------------------------------
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class SetTest {
	public static void main(String[] args) {
		
		//Set계열: 순서X ,index X , 중복Data허용 X
		
		//Set은 interface여서 직접new 생성 불가능
		//Set set= new Set(); //error
		
		//Set 인터페이스를 구현한 하위 클래스들 사용
		//1. HashSet       :순서 X, index X, 중복Data X
		//2. TreeSet       :저장된 값에 따라 정렬되는 Set , 성능Good
		//3. LinkedHashSet : 저장된 순서대로 정렬된 Set, 성능이 가장 안좋음
		
		//HashSet<String> set=new HashSet<String>();
		//TreeSet<String> set=new TreeSet<String>();  //오름차순
		LinkedHashSet<String> set = new LinkedHashSet<String>();  //저장된 순서
		//요소 추가
		set.add(new String("aaa"));
		set.add("bbb");   //자동new String()
		set.add("ccc");
		set.add("ddc");
		set.add("ffb");
		set.add("bbb"); //중복데이터
		set.add("eee");
		set.add("ccc"); //중복데이터
		
		//요소 개수
		System.out.println(set.size()+ ":"+set.toString());  //중구난방으로 나옴. 
		
		//인데스번호가 없기에.. 요소값을 얻어오는 get()이 존재하지 않음.
		//set.get();
		
		//순차적으로 얻어오는 방법존재
		//방법 1. for each문 (확장된 for문) **
		for(String t: set) {
			System.out.println(t);
		}
		System.out.println();
		
		//방법 2. 반복자(Iterator)를 이용하는 방법
		Iterator<String> datas=set.iterator();
		while(true) {
			while(datas.hasNext()) {
				String e = datas.next();
				System.out.println(e);
				//Set를 사용하는 가장 중요한 이유!!
				//중복 데이터를 허용하지 않기에
				//블루투스 장치 검색이 중복으로 되지 않는 등의  작업을 할때 사용됨.
			}
}
		}
	}
    ----------------------------------------------------------------------------------------
    import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

public class MapTest {

	public static void main(String[] args) {
		//Map계열: 키- 벨류 쌍(Key-Value- Pair)으로 데이터를 저장하는 방식
		//Map도 interface여서 직접 객체 생성 불가능
		//Map 인터페이스를 구현한 하위 클래스들을 사용
		//1. HashMap       :저장순서 X, 인덱스 X, 대신 Key(식별자)사용 /중복key사용 안됨, 중복Data허용.
		//2. TreeMap       :key(식별자)의 오름차순으로 정렬
		//3. LinkedHashMap : 저장순서대로 ... 정렬됨. 
		//4. HashTable     :HashMap와 99%  같음(멀티스레드에서 동기화 처리가 되어 있음.)
		
		//<키 타입, 벨류 타입>
		//HashMap<String, String> map=new HashMap<String, String>();
		//TreeMap<String, String> map=new TreeMap<String, String>();   //키값의 오름차순
		LinkedHashMap<String, String> map=new LinkedHashMap<String, String>();  //저장순
		
		//요소 추가;
		map.put("Name", "Hong");
		map.put("ID", "abcd");
		map.put("PW", "1234");
		map.put("kkk", "Hong");  //중복 data는 허용
		map.put("kkk", "Park");   //중복 key는 허용x    -->저장이 안되는 것이 아니라 그 값이 변경되는 것.
		
		System.out.println(map.size());
		
		//요소 얻어오기
		String s = map.get("Name");
		System.out.println(s);
		System.out.println(map.get("ID"));
		System.out.println(map.get("PW"));
		System.out.println(map.get("kkk"));
		
		System.out.println(map.toString());
		
		//요소값을 순차적으로 얻어오기
		//방법 for, for each문 불가능
		//방법1. 먼저 key값들만 먼저 뽑아와서 작업
		Set<String> keys =map.keySet();
		//1.1 keys를 for each로
		for(String key: keys) {
			String e = map.get(key);
			System.out.println(e);
		}
		System.out.println();
		
		//1.2 keys를 반복자로 접근
		Iterator <String>datas =keys.iterator();
		while(datas.hasNext()) {
			String key= datas.next();
			System.out.println(key+ ":" + map.get(key));
		}
		System.out.println();
		
		//방법2. Map의 요소들을 Set으로 변경하여 가져오기
		//Map의 요소(키-밸류 쌍) 객체인 Entry의 Set 얻어오기
		Set<Entry<String, String>> entries =map.entrySet();
		for(Entry<String, String> e :entries) {
			System.out.println(e.getKey() + ":" + e.getValue());
		}
	}
}

'JAVA' 카테고리의 다른 글

조건문(if, witch), 반복문(while, for), 기타제어문(break, continue)  (0) 2023.08.30
Thread  (0) 2023.08.30
Generic  (0) 2023.08.30
예외처리: try-catch-finally, throws, throw  (0) 2023.07.15
Object 클래스: 모든 클래스의 (최상위)  (0) 2023.07.15