컬렉션 프레임워크란?
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화 된 방법을 제공하는 클래스의 집합,
-> 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
주요 인터페이스
- 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]네트워크 (1) | 2024.03.08 |
---|---|
[JAVA]Thread (0) | 2024.03.05 |
[JAVA]입출력( I / O ) #2 (2) | 2024.02.26 |
[JAVA]입출력( I / O ) (0) | 2024.02.22 |
[JAVA]예외처리 (0) | 2024.02.22 |