SET 컬렉션
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체 저장, 객체가 성공적으로 저장되면 true 리턴 중복 객체면 false |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 조사 |
boolean isEmpty() | 컬렉션이 비어 있는지 조사 | |
Iterator<E> inerator() | 저장된 객체를 한 번씩 가져오는 반복자를 리턴한다. | |
int size() | 저장되어 있는 전체 객체 수를 리턴한다. | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제합니다. |
boolean remove(Object o) | 주어진 객체를 삭제합니다. |
리턴 타입 | 메소드 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴 |
E | next() | 컬렉션에 하나의 객체를 가져온다. |
void | remove() | Set 컬렉션에서 객체를 제거 |
package sec01.exam01;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetEx {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
// set.add(123); 문자열만 가능
set.add("123");
set.add("김길동");
set.add("가나다");
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
// for(String str : set) {
// System.out.println(str);
// }
}
}
hashCode()와 equals() 메소드 재정의
정의
package sec01.exam02;
import java.util.Objects;
public class Member {
public String name;
public int age;
public Member(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
return age == other.age && Objects.equals(name, other.name);
}
@Override
public int hashCode() {
System.out.println("hashCode");
return Objects.hash(age, name);
}
}
실행
package sec01.exam02;
import java.util.HashSet;
import java.util.Set;
public class HashSetEX {
public static void main(String[] args) {
// 데이터 입력 받을 때 중복 검사할 수 있음
Set<Member> set = new HashSet<Member>();
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30));// 인스턴스는 다르지만 내부데이터가 동일하므로 객체 1개만 저장
set.add(new Member("홍길동", 30));
// 두개 비교 후 나머지 한개 비교
System.out.println("총 객체수 : " + set.size()); // 저장된 객체 수 얻기
}
}
<결과>
hashCode
hashCode
equals
hashCode
equals
총 객체수 : 1
데이터 입력 받을 때 중복 검사 가능
중복 저장 방지
Map 컬렉션
Map 컬렉션은 키(key)와 값(Value)으로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있다.
Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스이다. 키와 값은 모두 객체
키는 중복 저장될 수 없지만 값은 중복 저장이 가능, 만약 기존에 저장된 키와 동일한 키로 값을 저장하면
기존의 값은 없어지고 새로운 값으로 대체 된다.
Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스의 메소드들
키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많다.
<K,V> 타입 파라미터는 Map컬렉션을 생성할 때 키와 객체 타입을 결정하라는 뜻
package sec01.exam03;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapEntryEx {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 해시맵이라고 부름
map.put("김", 100);
map.put("이", 95);
map.put("박", 90);
// System.out.println(map.get("이"));
// map 구조를 set으로 변경 ( for문 사용할라고 ) 많이 사용됨
// Set<Map.Entry<String, Integer>> es = map.entrySet();
// for(Map.Entry<String, Integer> a1 : es) {
// System.out.println(a1.getKey()); // 키 값 출력
// System.out.println(a1.getValue());// value 값 출력
// }
Set<Map.Entry<String, Integer>> es = map.entrySet();
Iterator<Map.Entry<String, Integer>> it = es.iterator();
while(it.hasNext()) {
Map.Entry<String, Integer> a1 = it.next();
System.out.println(a1.getKey());
System.out.println(a1.getValue());
}
}
}
<결과>
김
100
이
95
박
90
주석 달린 것 처럼 map 구조를 set으로 변경 후 for문으로 사용할 때 많이 사용됨
HashMap
Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. HashMap의 키로 사용할 객체는 hashCode()와 equals()
메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복
저장되지 않도록 하기 위함이다. 동등 객체의 조건은 hashCode()의 리턴값이 같아야 하고, equals()메소드가
true를 리턴해야 한다.
주로 키 타입은 String을 많이 사용하는데, String은 문자열이 같을 경우 동등 객체가 될 수 있도록 hashCode()와
equals() 메소드가 재정의되어 있다. HashMap을 생성하기 위해서는 키 타입과 값 타입을 타입 파라미터로 주고기본 생성자를 호출하면 된다.
이름을 키로 점수를 값으로 저장하기 예제 ( HashMap 사용 방법 )
package sec01.exam04;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapEx {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95); // 홍길동은 키 값이 같기 때문에 마지막에 저장한 값으로 대체
System.out.println("총 Entry 수 : " + map.size()); // 저장된 총 Entry
// 객체 찾기
System.out.println("\t홍길동 : " + map.get("홍길동"));// 이름(키)으로 점수(값)를 검색
System.out.println();
// 객체를 하나씩 처리
Set<String> keSet = map.keySet();// key set 얻기
//향상된 for문 밑에 Iterator 안쓰고 사용 가능
for(String str : keSet) {
System.out.println(str);
Integer val = map.get(str);
System.out.println(val);
}
// Iterator<String> keIterator = keSet.iterator();
// while(keIterator.hasNext()) {
// String key = keIterator.next();
// Integer value = map.get(key);
// System.out.println("\t" + key + ":" + value);
// }
System.out.println();
// 객체 삭제
map.remove("홍길동");// 키로 Map.Entry를 제거
System.out.println("총 Entry 수 : " + map.size());
// 객체를 하나씩 처리
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();// Map.Entry Set 얻기
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("\t" + key + ":" + value);
}
System.out.println();
// 객체 전체 삭제
map.clear();
System.out.println("총 Entry 수 : " + map.size());
}
}
<결과>
총 Entry 수 : 3
홍길동 : 95
홍길동
95
신용권
85
동장군
80
총 Entry 수 : 2
신용권:85
동장군:80
총 Entry 수 : 0
Hashtable
HashMap과 동일한 내부 구조를 가지고 있다. Hashtable도 키로 사용할 객체는 hashCode()와 equals()
메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
차이점은 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동싱에 Hashtable의 메소드들을 실행할 수
없고 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 점 때문에 멀티 스레드 환경에서
안전하게 객체를 추가, 삭제할 수 있어서 안전합니다.
아이디와 비밀번호 검사하기
package sec01.exam04;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class HashTableEx {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("spring", "12");
map.put("summer", "123");
map.put("fall", "1234");
map.put("winter", "12345");
Scanner scan = new Scanner(System.in);
while(true) {
System.out.println("아이디와 비밀번호를 입력해주세요.");
System.out.print("아이디 : ");
String id = scan.nextLine();
System.out.print("비밀번호 : ");
String pw = scan.nextLine();
if(map.containsKey(id)) {
if(map.get(id).equals(pw)) {
System.out.println("로그인되었습니다.");
break;
}else {
System.out.println("비밀번호가 일치하지 않습니다.");
}
}else {
System.out.println("입력하신 아이디가 존재하지 않습니다.");
}
}
}
}
'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글
2023-06-28 29일차 (0) | 2023.06.28 |
---|---|
2023-06-26 27일차 (0) | 2023.06.26 |
2023-06-21 24일차 (0) | 2023.06.21 |
2023-06-20 23일차 (0) | 2023.06.20 |
JDBC_설정(MariaDB, 이클립스) (1) | 2023.06.17 |