01. HashSet 클래스
1. Set인터페이스를 상속받은 HashSet 객체 생성 방법
방법1) 제네릭(Generic)을 사용해 HashSet 객체 생성 - 권장
- HashSet 객체에는 제네릭 대신 설정된 클래스의 객체만 저장 가능
- HashSet 객체에 저장된 객체를 반환받아 사용할 경우 명시적 객체 형변환하지 않아도 사용 가능
HashSet<String> set = new HashSet<String>(); //권장
//배열처럼 String 객체 여러개 저장 가능~ (타입:String)
set.add("홍길동");
set.add("sdfsd");
//set.add(100); //error
방법2) 인터페이스 참조변수(부모)인 Set으로 HashSet객체(자식) 생성 - 매우 권장
- 특히, 인터페이스가 있다면 더더욱 매우 권장!!!!!!!!!!
- 왜?
- 참조변수에는 인터페이스를 상속받은 모든 자식클래스의 객체 를 저장할 수 있기 때문
- 클래스 간의 결합도를 낮추어 유지보수의 효율성이 증가되기 때문
Set<String> set = new HashSet<String>(); //매우권장 - 결합도가 낮아짐
//예를들어,
Set<String> set = new HashSet<String>(); //을
Set<String> set = new LinkedHashSet<String>(); //로 변경한다면?
//오버라이드 선언한 같은 메소드를 호출하기 때문에 굳이 코드를 변경할 필요 없음
// => 인터페이스(Day12 - jdbc인터페이스 참고하기)
// => 그러니 웬만하면 인터페이스를 상속받은 자식클래스는 인터페이스참조변수(부모)로 자식객체 생성하자!
2. Set인터페이스가 가진 메소드 사용하기
Set.add(E element) - 요소 추가
- Set 객체에 요소를 추가하는 메소드
- 요소(Element) : 자료구조 클래스의 객체에 저장되는 객!체!
- 즉, set객체 안에 새로운 객체를 추가하는 것~
- 여기서 E는 제네릭!
set.add("홍길동");
set.add("임꺽정");
set.add("전우치");
//set.add("100"); //ok
//=>제네릭으로 설정된 클래스의 객체가 아닌 경우 에러 발생
//set.add(100); //error
Set.toString() - 요소 문자열로 반환
- Set객체에 저장된 모든 요소(객체)를 문자열로 반환하는 메소드
- 주의) Set의 특징 (순서x,중복x) 이므로 순서상관없이 마구잡이로 출력됨
System.out.println("set.toString() = "+set.toString());
//set.toString() = [홍길동, 전우치, 임꺽정]
System.out.println("set = "+set);
//set = [홍길동, 전우치, 임꺽정]
Set.add(중복된 요소 넣는다면?)- NO!!!
//Set객체에는 동일한 값이 저장된 중복 객체 저장 불가
set.add("홍길동"); //중복추가 NO!!!
System.out.println("set = "+set);
//set = [홍길동, 전우치, 임꺽정]
Set.size() - 요소 갯수
- Set객체에 저장된 요소의 갯수를 반환해주는 메소드
//실제 기본 저장공간이 16개라도 모든 저장공간에 객체가 저장된 것은 아님
System.out.println("요소의 갯수 = "+ set.size());
//요소의 갯수 = 3
Set.remove() - 요소 제거
- Set객체에 저장된 요소를 제거하는 메소드
set.remove("임꺽정");
System.out.println("set = "+set); //set = [홍길동, 전우치]
Set.toArray(E[ ] a) - Set 객체를 배열로 반환
- Set 객체를 배열로 변환하여 반환하는 메소드
- new 배열을 생성해서 Set 객체에 저장된 모든 요소를 모두 배열 요소로 저장함
- (E[ ] a) : 어떤 배열로 변경할지 매개변수로 넘겨주기
- (new String[0]) : 제네릭이 String - String 배열로 만들것이다!
//set = [홍길동, 전우치] //[0] : 이 안에 넣는 요소의 갯수는 중요하지 않음! String[] setArray = set.toArray(new String[0]); //제네릭이 String - String 배열로 만들것이다! Arrays.sort(setArray); System.out.println(Arrays.toString(setArray)); //[전우치, 홍길동]
3. Set객체의 단점
- 저장된 요소를 가지고 오는 메소드가 없음ㅠㅠ
- 왜? 순서가 없잖아ㅠ
- 저장만 열심히 시킬 뿐, 특정 요소를 꺼낼 수 있는 방법은 없음ㅠ
- 즉, 요소들을 처리할 수 있는 방법이 없음!
- 메소드를 통해 처리할 수 없다면 처리할 수 있는 객체를 다시 만들자 → Iterator<E>객체
🍒 [반복처리를 위한 Iterator객체] Set.iterator()
- Set객체의 저장된 요소를 반복 처리할 수 있는 Iterator객체를 반환하는 메소드
- Iterator객체 : 자료구조 클래스의 객체의 요소를 반복 처리하기 위한 기능을 제공하는 객체
- 반복 지시자 : 커서를 사용하여 자료구조 클래스의 객체의 요소를 반복 처리
//제네릭사용해 Iterator객체를 반환받음
Iterator<String> iterator = set.iterator();
//🍒 Iterator.hasNext() : Iterator객체로 처리 가능한 요소의 존재 유무를 판단하여 결과를 반환하는 메소드
// => Iterator객체로 처리 가능한 요소가 존재합니까?
// => false 반환 : 처리요소가 존재하지 않아요. , true 반환 : 처리요소가 아직 존재 해요
//🍒 Iterator.next() : 처리 커서 위치의 요소(set객체에 저장되어있는 요소(=객체))를 읽어와 반환하는 메소드
// => 현재 요소를 읽어 반환한 뒤, 커서는 다음 요소 위치로 자동 이동
//🍒Iterator객체로 Set객체에 저장된 모든 요소에 대해 일괄처리해보자!
//Iterator객체가 하나씩 요소를 끄집어내면서 set객체에 처리될 요소가 있다면 반복처리하고, 없다면 나갈것임
while(iterator.hasNext()) {
String str = iterator.next();
System.out.print(str+" ");
}
System.out.println();
//홍길동 전우치
🍒 Iterator객체를 대신하는 향상된for문
- 향상된 for 구문을 사용하여 Set 객체에 저장된 요소에 대한 일괄처리
- 향상된 for 구문은 내부적으로 Iterator객체를 사용하여 반복 처리하는 것과 동일함
//향상된 for 구문의 배열의 일괄처리와 동일
//=>set객체에 저장된 요소를 하나씩 제공받아 일괄처리해줌
for(String str:set) {
System.out.print(str+" ");
}
System.out.println();
//홍길동 전우치
4. LottoSetApp
- Set 객체의 치명적인 단점 - 순서가 없음!!
- 자체적인 해결이 안되므로 배열로 바꿔서 사용함ㅜㅜ - Set.toArray(E[] a)
package xyz.itwill.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
//1~45 범위의 난수를 6개 제공받아 출력하는 프로그램
//=> 6개 난수는 서로 중복되지 않도록 작성하며 오름차순 정렬하여 출력
public class LottoSetApp {
public static void main(String[] args) {
//랜덤 수 6개를 저장할 Set객체 생성
Set<Integer> lottoSet = new HashSet<Integer>();
Random random = new Random();
//무한반복
while(true) {
//(0+1) <= random < (45+1) 범위의 난수값을 Set 객체의 요소로 추가하여 저장
lottoSet.add(random.nextInt(45)+1); //Set객체에는 중복요소 저장 불가능
//Set객체에 저장된 요소의 갯수가 6개일 경우 반복문 종료
if(lottoSet.size() == 6) break;
}
System.out.println("lottoSet = "+lottoSet); //lottoSet = [19, 40, 12, 28, 45, 14]
Integer[] lottoArray = lottoSet.toArray(new Integer[0]); //오름차순으로 정렬하기 위해 배열로 변경하기
System.out.println("lottoArray = "+Arrays.toString(lottoArray)); //lottoArray = [19, 40, 12, 28, 45, 14]
//Arrays.sort(Object[] o) : 매개변수로 배열을 전달받아 배열의 요소를 오름차순으로 정렬하는 메소드
Arrays.sort(lottoArray);
//Arrays.toString(Object[] o) : 매개변수로 전달받은 배열의 요소를 문자열로 반환하는 메소드
System.out.println("lottoArray의 sort() 후 = "+Arrays.toString(lottoArray)); //lottoArray의 sort() 후 = [12, 14, 19, 28, 40, 45]
System.out.println("행운의숫자 = "+Arrays.toString(lottoArray)); //행운의숫자 = [12, 14, 19, 28, 40, 45]
}
}
02. ArrayList 클래스
- List객체는 요소를 차례대로 저장
- 첨자(Index)를 이용하여 요소 구분
1. List인터페이스를 상속받은 ArrayList객체 생성방법
방법1) 제네릭(Generic)을 사용해 ArrayList 객체 생성 - 권장
ArrayList<String> list = new ArrayList<String>();
방법2) 인터페이스참조변수(부모)로 ArrayList객체(자식) 생성 - 매우권장
List<String> list = new ArrayList<String>();
2. List인터페이스가 가진 메소드 사용하기
List.add(E element) - 객체 추가
- List 객체에 요소를 추가하는 메소드
list.add("홍길동");
list.add("임꺽정");
list.add("전우치");
list.add("일지매");
List.toString() - 객체 문자열로 반환
- List객체에 저장된 모든 요소를 문자열로 반환하여 변환하는 메소드
System.out.println("list.toString() = " + list.toString());
//list.toString() = [홍길동, 임꺽정, 전우치, 일지매]
System.out.println("list = " + list);
//list = [홍길동, 임꺽정, 전우치, 일지매] - 순서가 있음
List.add(중복된 객체를 넣는다면?) - OK!!!! (오버로드된 메소드)
//list = [홍길동, 임꺽정, 전우치, 일지매]
//List객체에는 동일한 값의 객체를 요소도 저장 가능
list.add("임꺽정");
System.out.println("list = " + list);
//list = [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]
List.size() - 객체 갯수
- List 객체에 저장된 요소의 갯수를 반환하는 메소ㄷ
//list = [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]
System.out.println("요소의 갯수 = " + list.size());
//요소의 갯수 = 5
List.get(int index) - 객체 첨자 위치
- List 객체에 저장된 요소 중 첨자 위치의 요소를 반환하는 메소드
//list = [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]
System.out.println("3번째 요소에 저장된 이름 = "+ list.get(2));
//3번째 요소에 저장된 이름 = 전우치
List.add(int index,E element) - 중간에 객체 삽입 (오버로드된 메소드)
- 오버로드된 메소드 : 매개변수가 다른 이름이 같은 메소드
- List 객체에 원하는 첨자 위치에 요소를 삽입하는 메소드
//list = [홍길동, 임꺽정, 전우치, 일지매, 임꺽정]
list.add(4, "장길산"); //=> index를 전달하면 삽입메소드!
System.out.println("list = " + list);
//list = [홍길동, 임꺽정, 전우치, 일지매, 장길산, 임꺽정]
List.remove(E element) - 객체 제거 (오버로드된 메소드)
- List 객체에 저장된 요소를 제거하는 메소드
- 주의 ) 매개변수로 전달받은 객체와 같은 요소가 여러개인 경우 첫번째 요소만 제거
//list = [홍길동, 임꺽정, 전우치, 일지매, 장길산, 임꺽정]
list.remove("임꺽정");
System.out.println("list = " + list);
//list = [홍길동, 전우치, 일지매, 장길산, 임꺽정]
List.remove(int index) - 첨자로 객체 제거 (오버로드된 메소드)
- List 객체에서 원하는 첨자 위치의 요소를 제거하는 메소드
//list = [홍길동, 임꺽정, 전우치, 일지매, 장길산, 임꺽정]
list.remove(5);
System.out.println("list = " + list);
//list = [홍길동, 임꺽정, 전우치, 일지매, 장길산]
List.set(int index,E element) - 객체 변경
- List객체에서 원하는 첨자 위치의 요소를 변경하는 메소드
//list = [홍길동, 임꺽정, 전우치, 일지매, 장길산]
list.set(1, "임걱정");
System.out.println("list = " + list);
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
List.clear()
- List객체에 저장된 모든 요소를 제거하여 초기화 처리하는 메소드
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
list.clear();
System.out.println("list = "+list);
//list = []
List.isEmpty()
- List객체에 저장된 요소가 하나도 없는 경우 true를 반환하는 메소드
- 아무것도 없는지 검사할때 사용함
- 웹프로그램에서는? 댓글이 없을 때 "댓글이 하나도없습니다."를 출력하고싶을때 사용
//list = []
if(list.isEmpty()) {
System.out.println("list 객체에 저장된 요소가 하나도 없습니다.");
}
//list 객체에 저장된 요소가 하나도 없습니다.
3. 🔥 List 객체에 저장된 요소에 대한 일괄 처리
🔥일반 for 구문 사용
- 배열처럼 첨자가 있기 때문에 일반 for 구문 사용가능
- BUT 배열은 아니지만 첨자가 있기 때문에, IndexOutOfBoundsException예외 발생 가능 있음
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
for(int i=0; i<list.size(); i++) {
System.out.print(list.get(i)+ " ");
}
System.out.println();
//홍길동 임걱정 전우치 일지매 장길산
🔥Iterator객체 사용
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next()+ " ");
}
System.out.println();
//홍길동 임걱정 전우치 일지매 장길산
🔥향상된 for구문 사용
- 향상된 for구문은 내부적으로 자체적인 iterator를 이용한다고 생각하면 된다!
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
//가장 많이 이용함
for(String str: list) {
System.out.print(str+ " ");
}
System.out.println();
//홍길동 임걱정 전우치 일지매 장길산
4. Collections.sort(List<E> list)
- list 객체의 요소를 정렬하는 메소드
- Collections 클래스 : 자료구조 관련 클래스의 객체 요소에 대한 처리 기능을 메소드로 제공하는 클래스
//list = [홍길동, 임걱정, 전우치, 일지매, 장길산]
Collections.sort(list);
System.out.println("list = "+list);
//list = [일지매, 임걱정, 장길산, 전우치, 홍길동]
//앞서 Arrays클래스 사용해서 배열을처리한것 - 배열 정리
//Collections클래스도 가진 메소드가 Arrays와 비슷 - list 정리
5. 🔥 Set객체 → 배열 → List객체
🔥Set객체를 → 배열로(Arrays)
- Set.toArray(E[ ] a) : Set 객체를 배열로 변환하여 반환하는 메소드
Set<String> set = new HashSet<String>();
set.add("abc");
set.add("123");
set.add("def");
set.add("456");
String[] setArray = set.toArray(new String[0]);
System.out.println(setArray[0]);
System.out.println(setArray[1]);
System.out.println(setArray[2]);
System.out.println(setArray[3]);
//123
//abc
//def
//456
🔥배열을(Arrays) → List객체로
- Arrays.asList(E... a) : 0개 이상의 요소가 저장된 List 객체를 생성하여 반환하는 메소드
- ... : 매개변수를 0개 이상 전달받아 사용할 수 있다는 뜻
- 내부적으로 만드는것이 vector인지 arraylist인지 모르기때문에 List로 참조변수 만들어 사용함
//예제1
List<String> setList = Arrays.asList(setArray);
System.out.println(setList);
//[123, abc, def, 456]
//예제2
List<Integer> numberList = Arrays.asList(10,20,30,40,50);
System.out.println("numberList = "+numberList);
//numberList = [10, 20, 30, 40, 50]
03. HashMap 클래스
1. Map인터페이스를 상속받은 HashMap객체 생성방법
인터페이스 참조변수(부모)로 HashMap객체(자식) 생성
- Map 인터페이스를 상속받은 자식클래스는 이름과 값에 대한 제네릭 2개를 전달하여 사용
//ok ,<>에 아무것도 적지 않아도 <String, String>이 됨
Map<String, String> map = new HashMap<>();
Map<Integer, String> map = new HashMap<Integer, String>();
2, Map인터페이스가 가진 메소드 사용하기
- Map 메소드는 Set, List과 부모가 달라 가진 메소드도 완전 다름
Map.put(K key, V value) - 엔트리 저장 & 변경
- Map 객체에 엔트리를 추가하는 메소드
- 새로운 Key : 저장 , 중복 Key : 변경
- 메소드 호출 시 이름(Key)가 중복될 경우 기존값 대신 새로운 값으로 변경됨
- 주의)
- 이름(Key)은 Set객체 형식으로 저장 (중복x , 순서x)
- 값(Value)은 Collection객체 형식으로 저장
map.put(1000, "홍길동");
map.put(2000, "임꺽정");
map.put(3000, "전우치");
map.put(4000, "일지매");
map.put(5000, "장길산");
System.out.println("map = "+map);
//map = {2000=임꺽정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
//변경메소드가 따로 없음
map.put(2000, "임걱정");
System.out.println("map = "+map);
//map = {2000=임걱정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
Map.toString() - 엔트리 문자열로 반환
- Map객체에 저장된 모든 엔트리를 문자열로 변환하여 반환하는 메소드
System.out.println("map.toString() = "+map.toString());
//map = {2000=임걱정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
System.out.println("map = "+map);
//map = {2000=임걱정, 4000=일지매, 1000=홍길동, 3000=전우치, 5000=장길산}
Map.remove(K key) - 엔트리 제거
- Map객체에 저장된 엔트리를 이름(Key)을 이용하여 제거하는 메소드
map.remove(4000); //값을 전달받아 삭제도 가능하지만 비권장!
System.out.println("map = "+map);
//map = {2000=임걱정, 1000=홍길동, 3000=전우치, 5000=장길산}
Map.get(K key) - 엔트리 검색
- Map객체에 저장된 엔트리에서 이름(Key)을 이용하여 값(value)을 검색하여 반환하는 메소드
- 이름으로 저장된 값이 없는 경우 [null]을 반환
- Map을 사용하는 가장 중요한 이유, 검색속도가 매우 빠름!!!!
String name = map.get(1000);
System.out.println("name = "+name);
//name = 홍길동
String name = map.get(8000);
System.out.println("name = "+name);
//name = null
Map.keySet() - 모든 키들 / Set객체로 반환
- Map객체에 저장된 모든 엔트리의 이름(Key)을 Set 객체로 반환하는 메소드
Set<Integer> onlyKey = map.keySet();
System.out.print(onlyKey);
//[2000, 1000, 3000, 5000]
Map.values() - 모든 값들 / Collection객체로 반환
- Map객체에 저장된 모든 엔트리의 값(Value)을 Collection 객체로 반환하는 메소드
Collection<String> onlyValue = map.values();
System.out.print(onlyValue);
//[임걱정, 홍길동, 전우치, 장길산]
3. Map 객체에 저장된 엔트리에 대한 일괄 처리
- 키만! 혹은 값만! 따로 제공받아 일괄처리가능하다!
- 사실 Map에서의 일괄처리는 그렇게 중요하지는 않음
- 가장 중요한 것은 put메소드, get메소드를 통해 값 추가 & 값 검색을 하여 반환하는 것
🍋Iterator객체 사용 - 키만 제공받아 엔트리에 대한 일괄처리
//Map객체의 모든 키들만 반복처리해주세요~
Iterator<Integer> iteratorKey = map.keySet().iterator();
while(iteratorKey.hasNext()) { //iterator 사용했기때문에 굳이 명시적객체형변환은 필요없음
//=> Set객체에 저장된 이름(Key)을 반환받아 저장
Integer key = iteratorKey.next();
System.out.println(key+ " = "+map.get(key));
}
//순서없이 무작위로 출력됨!
//2000 = 임걱정
//1000 = 홍길동
//3000 = 전우치
//5000 = 장길산
🍋Iterator객체 사용 - 값만 제공받아 엔트리에 대한 일괄처리
Iterator<String> iteratorValue = map.values().iterator();
while(iteratorValue.hasNext()) {
System.out.print(iteratorValue.next()+" ");
}
System.out.println();
//임걱정 홍길동 전우치 장길산
🍋향상된 for구문 사용 - 키만 제공받아 엔트리에 대한 일괄처리
for(Integer key:map.keySet()) {
System.out.println(key+ " = "+map.get(key) );
}
//순서없이 무작위로 출력됨!
//2000 = 임걱정
//1000 = 홍길동
//3000 = 전우치
//5000 = 장길산
🍋향상된 for구문 사용 - 값만 제공받아 엔트리에 대한 일괄처리
for(String value:map.values()) {
System.out.print(value+ " ");
}
//임걱정 홍길동 전우치 장길산
'java > java.util & java.text' 카테고리의 다른 글
[java.util] 8. 정규표현식(regex)을 이용한 로그인 프로그램 (0) | 2024.06.28 |
---|---|
[java.util] 7. 학생 관리 프로그램 (Set,List,Map 활용) (0) | 2024.06.28 |
[java.util] 5. Collection(자료구조)클래스 기초 (0) | 2024.06.27 |
[java.util] 4. Generic VS Non-Generic (0) | 2024.06.27 |
[java.text] 3. DecimalFormat 클래스 & SimpleDateFormat 클래스 (0) | 2024.06.26 |