개발공부
JAVA쪼렙탈출기: collection
Yuniverse.
2023. 6. 17. 09:14
Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.
collection
ArrayList
- 객체를 index로 관리
- 저장용량이 초과되면 자동으로 늘어난다.
Iterator
collection에 보관하고 있는 데이터에 순차적으로 접근할 때 사용
hasNext( ) | 데이터가 있는지 확인 |
next( ) | 데이터 가져오기 |
remove( ) | 데이터 삭제하기 |
public class ExArrayList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// add : 데이터 추가
list.add("축구");
list.add("야구");
list.add("농구");
System.out.println(list);
System.out.println();
// add(index, object) : index 위치에 추가
list.add(1, "배구");
System.out.println(list);
System.out.println();
// size() : 데이터 수 확인
System.out.println("데이터 수 : " + list.size());
System.out.println();
// contains(object) : 데이터 확인
System.out.println("농구 확인 : " + list.contains("농구"));
System.out.println("하키 확인 : " + list.contains("하키"));
System.out.println();
// remove(object) : 데이터 삭제
System.out.println("축구 삭제 : " + list.remove("축구"));
System.out.println(list);
System.out.println();
// get(index) : index 위치의 데이터 가져오기
System.out.println("1번째 index : " + list.get(1));
System.out.println();
// list 객체 확인
for(int i=0; i<list.size(); i++) {
System.out.println(i + "번 : " + list.get(i));
}
System.out.println();
// forEach() : 하나씩 접근해서 값 빼내올 때는 forEach()가 훨씬 편리하다.
for(String data : list) {
System.out.println(data);
}
System.out.println();
// Iterator
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String data = it.next();
System.out.println(data);
}
}
}
[결과값]
[축구, 야구, 농구]
[축구, 배구, 야구, 농구]
데이터 수 : 4
농구 확인 : true
하키 확인 : false
축구 삭제 : true
[배구, 야구, 농구]
1번째 index : 야구
0번 : 배구
1번 : 야구
2번 : 농구
배구
야구
농구
배구
야구
농구
HashSet
객체 저장시 순서가 없고, 동일한 객체는 중복 저장되지 않는다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getAge() { return age; }
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name + " - " + age + " 세";
}
}
public class ExHashSet {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
// Set<Person> set = new HashSet<>(); 라고 써도 된다.
set.add(new Person("김철수", 39));
set.add(new Person("박영수", 41));
set.add(new Person("홍길동", 45));
set.add(new Person("이민수", 43));
set.add(new Person("김철수", 39));
System.out.println(set); // set은 들어간 순서대로 값이 나오지 않는다.
System.out.println();
for(Person man : set) {
System.out.println(man);
}
System.out.println();
Iterator<Person> it = set.iterator();
while(it.hasNext()) {
Person tmp = it.next();
System.out.println(tmp);
// Iterator는 객체 삭제 가능
if(tmp.getName().equals("홍길동")) {
it.remove();
}
}
System.out.println();
System.out.println(set);
}
}
[결과값]
[이민수 - 43 세, 김철수 - 39 세, 박영수 - 41 세, 홍길동 - 45 세, 김철수 - 39 세]
이민수 - 43 세
김철수 - 39 세
박영수 - 41 세
홍길동 - 45 세
김철수 - 39 세
이민수 - 43 세
김철수 - 39 세
박영수 - 41 세
홍길동 - 45 세
김철수 - 39 세
[이민수 - 43 세, 김철수 - 39 세, 박영수 - 41 세, 김철수 - 39 세]
-> 이 코드에서 보면 '김철수 - 39세'가 2번 나오는 것을 볼 수 있다. 이는 우리 눈에는 동일값으로 보여도 hashCode가 다른 것으로 인식되기 때문이다.
따라서 이를 동일값으로 인식되게끔하려면 Person 클래스의 코드를 아래와 같이 작성해주면 된다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public int getAge() { return age; }
public void setAge(int age) {
this.age = age;
}
public int hashCode() {
return name.hashCode() + age;
}
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person tmp = (Person)obj;
if(!name.equals(tmp.name))
return false;
if(!(age==tmp.age))
return false;
return true;
}
return false;
}
public String toString() {
return name + " - " + age + " 세";
}
}
그리고 나서 ExHashSet 클래스를 실행시키면 '김철수 - 39세'가 중복값으로 인식되어 1번만 출력되는 것을 볼 수 있을 것이다.
HashMap
- key, value로 관리
- key는 중복될 수 없지만, value는 중복처리가 가능하다.
- 기존에 저장된 key와 동일한 key로 값을 추가하면, 기존값은 없어지고 새로운 값으로 변경된다.
public class ExHashMap {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
// put() : 데이터 추가
map.put("디지몬", "아구몬");
map.put("포켓몬", "피카츄");
map.put("산리오", "쿠로미");
// map.put("디지몬", "파닥몬"); // 동일key를 추가하면 새로운 값으로 변경
System.out.println(map);
System.out.println();
// get() : 데이터 가져오기
System.out.println("포켓몬 소속 : " + map.get("포켓몬"));
System.out.println();
// 전체 데이터 접근
Set<String> ks = map.keySet(); // key값만을 모아서 하나의 set 생성
Iterator<String> it = ks.iterator(); // set의 반복자 생성
while(it.hasNext()) {
String key = it.next();
String value = map.get(key);
System.out.println(key + " - " + value);
}
}
}
[결과값]
{디지몬=아구몬, 포켓몬=피카츄, 산리오=쿠로미}
포켓몬 소속 : 피카츄
디지몬 - 아구몬
포켓몬 - 피카츄
산리오 - 쿠로미