JAVA

[JAVA] Collection(List , set , Map)

로돌씨 2024. 2. 27. 08:40
컬렉션 프레임워크란?
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화 된 방법을 제공하는 클래스의 집합,
-> 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것

 

주요 인터페이스

  • List 인터페이스
  • Set 인터페이스 
  • Map 인터페이스

List: 순서가 있는 데이터의 집합 , 데이터의 중복을 허용함

 

예제

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

public class ArrayListTest {
	public void testArrayList() {

		ArrayList alist = new ArrayList(); // 기본적으로 10칸짜리 만들어짐

		// 다형성 적용하여 객체 생성 가능
		List list = new ArrayList();
		Collection clist = new ArrayList();

		alist.add("apple"); // -> 모든 타입을 저장할수있음
		alist.add(123); // 자동으로객체화 되어 저장됨 autoboxing (리터럴값 -> 객체)
		alist.add(5.67);
		alist.add(new Date());

		// 인덱스 순번대로 출력됨 , '어레이리스트는 객체만 저장가능하다.'

		System.out.println("alist :" + alist);
		for (int i = 0; i < alist.size(); i++) { // array는 size로 측정
			System.out.println(i + ":" + alist.get(i)); // 0번부터 순서대로 출력해줌
		}
		alist.add("apple");
		System.out.println("alist:" + alist);
		// 중복 저장가능함 (동일한 데이터지만인덱스가 다르기때문에 중복 허용)

		alist.add(1, "banana");
		System.out.println("alist:" + alist);
		// 원하는 위치에 저장 가능함 (원하는인덱스, 넣고싶은 데이터)
		// 덮어씌우는게아니라 추가한 뒤 데이터가 한칸씩 밀려남

		alist.remove(2);
		System.out.println("alist:" + alist);
		// index 2의 값이 사라지고 뒤의 데이터가 앞으로 당겨짐

		alist.set(1, new Boolean(true));
		System.out.println("alist:" + alist);
		// index 1의값이트루로 바뀜 (바나나가 트루로 '수정'됨)

	}

}

 

출력

import java.util.ArrayList;

public class Run {

	public static void main(String[] args) {
		
		ArrayListTest at = new ArrayListTest();
		at.testArrayList();
	}

}출력값:
0:apple
1:123
2:5.67
3:Mon Mar 06 17:50:58 KST 2023
alist:[apple, 123, 5.67, Mon Mar 06 17:50:58 KST 2023, apple]
alist:[apple, banana, 123, 5.67, Mon Mar 06 17:50:58 KST 2023, apple]
alist:[apple, banana, 5.67, Mon Mar 06 17:50:58 KST 2023, apple]
alist:[apple, true, 5.67, Mon Mar 06 17:50:58 KST 2023, apple]

 

ArrayListSort(정렬)

예제

public class Score implements Comparable { //정렬 위해 임플먼츠컴페어러블 추가
	private String name;
	private int score; //필드생성 

	public Score() {
	}

	public Score(String name, int score) {
		this.name = name;
		this.score = score;
	}//기본생성자와 매개변수 생성자 생성

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	} // 게터세터 생성 

	@Override
	public String toString() {
		return "Score [name=" + name + ", score=" + score + "]";
	}

	@Override
	public int compareTo(Object o) {
		//name 으로 기본정렬
		String otherName = ((Score)o).getName();
		return name.compareTo(otherName); //양수 정수 0 으로 결과나옴 
		//오름차순 정렬
		//name = 스트링값 네임을 컴페어투 함 
		//이름두개를 비교함 (name / otherName) 
		//"가" . compareTo("나") ->"가"가 먼저임  가 =1 나 =2라고 치면 1 -  2= -1 음수일시 자리바뀌지않음
		//박영석 = 김영석 비교했을때 김영석이 먼저임 => 양수리턴해줌 -> 자리를 바꿈
		//스코어 객체중 네임에 들어있는값을 비교함(getName)
		//내림차순은 "나"가 먼저와야함 음수를리턴했을때 자리를바꿔야한다.
		//내림차순 할시 음수를 리턴해야함 , 네임앞에 - 를붙여서 -name.compareTo(otherName);
		
	}
	
	
	
	
	
	
}
import java.util.Comparator;

public class ScoreSorting implements Comparator  {
	//점수 오름차순 정렬
	@Override
	public int compare(Object o1, Object o2) {
		//매개변수가 두개 , 비교되는 대상이 둘 이전의 이름 "가" , "나" 처럼
		int other1 = ((Score)o1).getScore();
		int other2 = ((Score)o2).getScore();
		
		if(other1>other2) {
			return 1; // (리턴값이 양수면 자리가 바뀜  ) 
		}else {
			return -1; // 음수면 자리가바뀌지않음 
		}//오름차순 . (내림차순으로 할거면 리턴값 음수양수를 서로바꿔주면 됨)
		
		
	}
	
	
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ScoreManager {
	public void scoreSort() {
		List list = new ArrayList();

		list.add(new Score("박XX", 95));
		list.add(new Score("이XX", 99));
		list.add(new Score("배XX", 88));
		
		list.add(new Score("김XX" , 72));
		list.add(new Score("하XX" , 64));
		list.add(new Score("이순X" , 55));
		
		
		System.out.println("list:" + list);
		
		//1. Comparable : 기본 정렬기준을 구현.
		//Collections.sort(list); //Collection.sort -> 정렬 해주는 구문
		list.sort(null); //-> 위와 같음
		System.out.println(list);
		
		//2. comparator : 기본정렬 기준 이외에 정렬기준 구현 .
		// 클래스 하나 더만들어정렬기준을 만들어주어야함 
		list.sort(new ScoreSorting()); // 기준을 만든클래스명으로 객체를 넣어줌 
		System.out.println(list);
		//오름차순으로점수가 정리됨
		
	}

}

출력

 

Set:순서를 유지하지 않는 데이터의 집합 , 데이터의 중복을 허용하지 않음

import java.util.Objects;

public class Score implements Comparable { //정렬 위해 임플먼츠컴페어러블 추가
	private String name;
	private int score; //필드생성 

	public Score() {
	}

	public Score(String name, int score) {
		this.name = name;
		this.score = score;
	}//기본생성자와 매개변수 생성자 생성

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	} // 게터세터 생성 

	@Override
	public String toString() {
		return "Score [name=" + name + ", score=" + score + "]";
	}

	@Override
	public int compareTo(Object o) {
		//name 으로 기본정렬
		String otherName = ((Score)o).getName();
		return name.compareTo(otherName); //양수 정수 0 으로 결과나옴 
		//오름차순 정렬
		//name = 스트링값 네임을 컴페어투 함 
		//이름두개를 비교함 (name / otherName) 
		//"가" . compareTo("나") ->"가"가 먼저임  가 =1 나 =2라고 치면 1 -  2= -1 음수일시 자리바뀌지않음
		//박영석 = 김영석 비교했을때 김영석이 먼저임 => 양수리턴해줌 -> 자리를 바꿈
		//스코어 객체중 네임에 들어있는값을 비교함(getName)
		//내림차순은 "나"가 먼저와야함 음수를리턴했을때 자리를바꿔야한다.
		//내림차순 할시 음수를 리턴해야함 , 네임앞에 - 를붙여서 -name.compareTo(otherName);
		
	}

	@Override
	public int hashCode() {
		return Objects.hash(name, score);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Score other = (Score) obj;
		return Objects.equals(name, other.name) && score == other.score;
	}
	
	
	
	
	
	
}

 

 

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;

public class TestHashSet {
	public void testHashSet() {
		HashSet hset = new HashSet();
		hset.add(new String("java"));
		hset.add(123);
		hset.add(34.43);
		hset.add(new Date());
		// 순서가 뒤죽박죽으로 출력이 됨

		System.out.println("hset: " + hset);

		hset.add(new String("java"));
		hset.add(123);

		System.out.println("hset: " + hset);
		// 중복되지않고 자동으로 하나로 줄어듬

		System.out.println(hset.size());
		System.out.println(hset.contains(123)); // 값이 들어있기때문에 트루 출력

		// 저장된 객체를 구분 할 수 없음
		// 해결방법
		// 1.toArray() (어레이로 바꾸고반복문 통해 하나씩 꺼내기)
		Object[] arr = hset.toArray();
		for (int i = 0; i < arr.length; i++) {
			System.out.println(i + ":" + arr[i]);

		}
		//2.Iterator() 
		Iterator iter = hset.iterator();
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
		hset.clear();
		System.out.println(hset.isEmpty()); //is~ 는 대부분 트루 펄스로 값이 나옴(무언가 확인하는기능)
		
		//삭 날아감 ㅋㅋ
		
		hset.add(new Score("박xx" , 99));
		hset.add(new Score("김xx" , 96));
		
		
		System.out.println("hset: " + hset);
		
		hset.add(new Score("박xx" , 99));
		System.out.println("hset: " + hset);
		//중복 허용함 , 주솟값이 달랐기때문에! 하지만 스코어 클래스에서 해시코드 ,
		//이퀄스 오버라이딩 해주니 중복이 사라짐  (중복 체크를통해 중복값 허용을 하지않는다.)
	}
}

 

출력

public class Run {

	public static void main(String[] args) {

		TestHashSet ts = new TestHashSet();
		ts.testHashSet();

	}

}출력값:
hset: [java, 123, 34.43, Mon Mar 06 18:24:31 KST 2023]
hset: [java, 123, 34.43, Mon Mar 06 18:24:31 KST 2023]
4
true
0:java
1:123
2:34.43
3:Mon Mar 06 18:24:31 KST 2023
java
123
34.43
Mon Mar 06 18:24:31 KST 2023
true
hset: [Score [name=박xx, score=99], Score [name=김xx, score=96]]
hset: [Score [name=박xx, score=99], Score [name=김xx, score=96]]

 

Map :

키와 값으로 구성되어있음, 둘다 객체

키는 중복저장을 허용하지않음 , 값은 중복을 허용함 → 키가 중복되는경우 값을 덮어씌움

키타입은 hashcode와 equals 메소드가 재정의 되어있는 String타입을 주로 사용

 

예제

import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestHashMap {
	public void testHashMap() {
		HashMap hmap = new HashMap();

		hmap.put("one", new Date());
		hmap.put(12, "red apple");
		hmap.put(33, 123);

		System.out.println("hmap: " + hmap);

		// 키는 중복 저장되지않는다. (set)
		hmap.put(12, "yellow banana");
		System.out.println("hmap: " + hmap);
		// red apple 이 사라지고 yellow banana 가 생김

		// 밸류는 중복 저장됨(list)
		hmap.put(122, "yellow banana");
		hmap.put(9, "yellow banana");
		System.out.println("hmap: " + hmap);
		// 동일한 밸류일지언정 키값이다르기때문에 구분 가능하다.

		System.out.println("키 9 의 밸류 : " + hmap.get(9));
		// 키를 이용해 밸류 찾기

		hmap.remove(9);
		System.out.println("hmap: " + hmap);
		// 9의 키 사라짐

	}

	public void testHashMap2() {
		// Map에 저장된 정보 연속처리

		HashMap map = new HashMap();

		map.put("one", "java 11");
		map.put("two", "mysql18");
		map.put("three", "jdbc");
		map.put("four", "html5");
		map.put("five", "css3");

		// 1. keySet() 이용해서 key 만 따로 set으로 만들고 ,
		// iterator () 사용하여 목록만듦.

		Set keys = map.keySet();
		Iterator keyIter = keys.iterator();
		while (keyIter.hasNext()) {
			String key = (String) keyIter.next();
			String value = (String) map.get(key);
			System.out.println(key + " : " + value);
		}
		// 2. value 만 values()로 처리
		Collection values = map.values();

		// 2.1 iterator()
		Iterator valIter = values.iterator();
		while (valIter.hasNext()) {
			System.out.println(valIter.next());
		}
		// 2.2 배열로 만들어 처리
		Object[] arr = values.toArray();
		for (int i = 0; i < arr.length; i++) {
			System.out.println(i + " : " + arr[i]);

		}

		// 3.map의 내부클래스인 EntrySet 이용 : entrySet();
		// 엔트리들을 셋으로 만들어 처리 하곘닥
		Set set = map.entrySet(); // 키와밸류의 묶음이 셋에 모여있음
		Iterator entryIter = set.iterator(); // 줄세우다.

		while (entryIter.hasNext()) {
			Map.Entry entry = (Map.Entry) entryIter.next();
			System.out.println(entry.getKey() + "=" + entry.getValue());
		}

	}

}

출력 

public class Run {

	public static void main(String[] args) {
		TestHashMap tm = new TestHashMap();
		tm.testHashMap();
		tm.testHashMap2();
	}

}출력값:
hmap: {33=123, one=Tue Mar 07 17:29:37 KST 2023, 12=red apple}
hmap: {33=123, one=Tue Mar 07 17:29:37 KST 2023, 12=yellow banana}
hmap: {33=123, one=Tue Mar 07 17:29:37 KST 2023, 9=yellow banana, 122=yellow banana, 12=yellow banana}
키 9 의 밸류 : yellow banana
hmap: {33=123, one=Tue Mar 07 17:29:37 KST 2023, 122=yellow banana, 12=yellow banana}
four : html5
one : java 11
two : mysql18
three : jdbc
five : css3
html5
java 11
mysql18
jdbc
css3
0 : html5
1 : java 11
2 : mysql18
3 : jdbc
4 : css3
four=html5
one=java 11
two=mysql18
three=jdbc
five=css3

 

Map(properties):

키와 값을 String 타입으로 제한한 컬렉션

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;

public class TestProperties {
	public void testProp() {
		Properties prop = new Properties();
		
		prop.setProperty("driver", "com.mysql.cj.jdbc.Driver"); //키값과 밸류가 모두스트링임 
		prop.setProperty("url", "jdbc:mysql://localhost/XXXX");
		prop.setProperty("id", "root");
		prop.setProperty("pw", "XXXX");
		System.out.println(prop);
		
		try {
			prop.store(new FileWriter("driver.txt"), "jdbc driver");
			prop.store(new FileOutputStream("driver.properties"),"jdbc driver");
			prop.storeToXML(new FileOutputStream("driver.xml"), "jdbc driver");
		} catch (FileNotFoundException e) {
			//store -> 저장하다 . 
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		//외부자원과 연결  , diver.properties 파일 만들어 파일안에 내용 저장함
	}
	public void testProp2() {
		//파일로부터 데이터를 읽어와 Properties에 저장
		Properties prop = new Properties();
		
		try {
			prop.load(new FileInputStream("driver.properties"));
			
			System.out.println(prop.getProperty("driver"));
			System.out.println(prop.getProperty("url"));
			System.out.println(prop.getProperty("id"));
			System.out.println(prop.getProperty("pw"));
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
	
			e.printStackTrace();
		}
	}
	}

 

출력

public class Run {

	public static void main(String[] args) {
		TestProperties tp = new TestProperties();
		tp.testProp();
		tp.testProp2();
	}

}출력값:
{driver=com.mysql.cj.jdbc.Driver, pw=XXXX, id=root, url=jdbc:mysql://localhost/XXXX}
com.mysql.cj.jdbc.Driver
jdbc:mysql://localhost/XXXX
root
XXXX

'JAVA' 카테고리의 다른 글

[JAVA]네트워크  (0) 2024.03.08
[JAVA]Thread  (0) 2024.03.05
[JAVA]입출력( I / O ) #2  (1) 2024.02.26
[JAVA]입출력( I / O )  (0) 2024.02.22
[JAVA]예외처리  (0) 2024.02.22