< 컬렉션 (Collection Framework) >
- 다수의 데이터를 효과적으로 처리할 수 있도록 표준화된 방법을 제공하는 클래스의 집합
- 컬렉션 프레임워크는 자바의 인터페이스를 사용하여 구현
- 배열이 가진 고정 크기의 단점을 극복하기 위한
가변 크기의 컨테이너로 객체의 개수 고려 하지 않아도 된다- 컬렉션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 올겨준다
주요 인터페이스
- List : 순서가 있는 데이터 집합, 데이터 중복 허용 (Vector, ArrayList, LinkedList, Stack, Queue)
- Set : 순서가 없는 데이터 집합, 데이터 중복 불허 (HashSet, TreeSet)
- Map : 키와 값이 쌍으로 이루어지는 데이터 집합, 순서가 없음. 키는 중복될 수 없지만 값은 중복 허용 (HashMap, TreeMap, Hashtable, Properties)
Collection 인터페이스
- List와 Set이 상속하는 인터페이스로 list와 set의 공통된 부분을 정의
Map 인터페이스
- Map은 구조상의 이유로 별도 인터페이스로 정의함
- Set
데이터의 중복을 허용하지 않는데 서로 다른 객체로 인식하여 중복 입력되는 것을 막기위해 hashcode, equals 오버라이딩을 필요로 한다.
Set<Person> set = new HashSet();
set.add(new Person("Hongkil", 10));
set.add(new Person("Hongkil", 10));
System.out.println(set);
}
}
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class Person {
String name;
int age;
@Override //name과 age를 +하여 또 하나의 객체를 만들어 가리키기 때문에 같은 hashcode를 갖게된다?
public int hashCode() {
return (this.name + this.age).hashCode();
}
@Override
public boolean equals(Object obj) {
Person another = (Person)obj;
return this.name.equals(another.name) && this.age == another.age;
}
}
** 비교
( == ) 연산 즉 객체의 주소 값을 비교
String의 경우 new를 이용하여 String 객체를 비교하면 주소값이 다르기에 정상 비교가 되지 않는다.
=> .equals()를 사용
- equals()를 오버라이딩했다면 반드시 hashCode() 비교도 동일한 동작을 하도록 오버라이딩 한다.
- 즉 [ A.equals(B) ]가 True라면 [ A.hashCode() == B.hashCode ]도 True가 되도록 만들어야 한다
< 제네릭 >
- 제네릭(타입한정) : 컬렉션 객체의 데이터 타입을 한정한다.
//ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<String> list = new ArrayList<String>();
list.add("1"); //String -> Object 형변환
list.add("2");
list.add("3");
list.add("4");
list.add("5");
// list.add(1); integer 넣을 수 없음
list.get(0); //string 타입으로 읽어옴
//Iterator it = list.iterator();
Iterator<String> it = list.iterator(); //타입 동일하게 설정 컬렉션에 제네릭을 적용하는것
while(it.hasNext()) {
String str = it.next();
System.out.println(str);
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.EmptyStackException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import Collection.Student;
public class WrapperTest { //1011Wrapper Class
public static void main(String[] args) {
//student 클래스의 compareto 오버라이딩 반으로 정렬
TreeSet<Student> set = new TreeSet<Student>();
Student s1 = new Student("kim", 9,1,10,10,10);
// Student s2 = new Student("pim", 3,1,10,10,10);
// Student s3 = new Student("gim", 4,1,10,10,10);
// Student s4 = new Student("him", 7,1,10,10,10);
Student s5 = new Student("qim", 1,1,10,10,10);
set.add(s1);
// set.add(s2);
// set.add(s3);
// set.add(s4);
set.add(s5);
Iterator it = set.iterator();
while(it.hasNext()) {
Student s = (Student) it.next(); //캐스팅 : 기본object 클래스로 넘겨주기때문
System.out.println(s.toString());
}
}
}
/*
Set<Integer> set = new HashSet<Integer>(); //부모타입인 set으로 도 가능
//빙고 중복 없는 데이터 넣기 위함
int[][] bingo = new int[5][5];
for(int i=0; set.size()<25 ; i++) {//set.size()로만 하면 중복되면 안들어가기 때문에 25개 안들어 갈 수 있음
set.add((int)(Math.random()*50)+1);
}
//System.out.println(set);
//골고루 섞어주는 기능
ArrayList list = new ArrayList(set);//셔플기능이 arraylist에 있기 때문에 (collection)
Collections.shuffle(list);
Iterator<Integer> it = list.iterator();
for(int i=0;i<bingo.length;i++) {
for(int j=0;j<bingo[i].length;j++) {
bingo[i][j] = it.next();
}
}
for(int i=0;i<bingo.length;i++) {
for(int j=0;j<bingo[i].length;j++) {
System.out.print(bingo[i][j] +" "); //1~2까진 1의자리가 섞이고 완전히 잘 섞이진 않는다
}
System.out.println();
} */
'java' 카테고리의 다른 글
Collection(Map) (0) | 2022.10.12 |
---|---|
Iterator (반복자 패턴) (0) | 2022.10.11 |
Collection(List) (0) | 2022.10.11 |
래퍼 클래스(Wrapper class) (0) | 2022.10.11 |
Calendar 클래스 (0) | 2022.10.11 |