20240822수업
Collection Framework
:데이터를 효율적으로 저장하고 그룹화 및 처리할 있는 인터페이스와 클래스 모음
Collection:객체를 수집해 저장하는 것
- Set과 List는 인터페이스이며 자바에서 인터페이스는 구현 클래스 없이 직접 인스턴스화할 수 없다.
- 인터페이스를 직접 사용할 수 없는 이유는 객체의 생성 방식이 인터페이스와 클래스의 차이 때문
List계열
- 순서를 유지하고 저장
- 중복된 주소와 값 저장 가능
- 구현 클래스:ArrayList, Vecctor, LinkedList
String[]names=new String [5];
names[0]="가나";
names[1]="나다";
names[2]="다라";
names[3]="라나";
names[4]="사나";
for (int i = 0; i < names.length; i++) {
System.out.print(names[i]+" \n");
}
⟦에러나는 경우⟧
//멤버 추가
names[5]="하나"; >>error
//ArrayIndexOutOfBoundsException :배열의 첨자가 경계를 벗어남 >>5가 없음.
ArrayList
List <String>nameList=new ArrayList<>();
displayList(nameList);
//add() size 증가, remove() size 감소
nameList.add("사나");
System.out.println(nameList.get(0)+"");
결과: 사나
nameList.add("나나");
nameList.add("라나");
nameList.add("다나");
displayList(nameList);
nameList.add("하나");
nameList.add("다나");
displayList(nameList);
nameList.remove("다나"); //먼저 찾은 문자열의 배열을 지움
nameList.remove(5); //주소를 지움
nameList.add(0,"가나"); //주어진 인덱스 (위치)에 객채(요소)를 추가
nameList.set(1, "Sana");//주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
Set 계열
- 정렬X 중복방지
- 순서 랜덤 저장
- ex)아이디 만들때 중복체크 for문 대신 사용가능
- HashSet, TreeSet, LinkedHashSet
HashSet
Set<String> set = new HashSet<>();
set.add("사나");
set.add("나나");
set.add("가나");
set.add("다나");
displaySet(set);
set.add("가나");
displaySet(set);
출력
private static void displaySet(Set<String> set) {
for (Iterator iterator = set.iterator(); iterator.hasNext();) {//첫번째 요소를 가리키는 Iterator 자동으로 앞에를 꺼내고 next를 가리키게 되는거
// >>i++같은 증가치 없음
String name = (String) iterator.next();
System.out.print(name+" ");
}
두 번씩 출력되는 이유
중복 요소 추가:
HashSet에 "가나"를 두 번 추가하고 있습니다. 첫 번째 추가는 정상적으로 이루어지지만, 두 번째 추가는 중복된 요소이기 때문에 저장되지 않습니다. 따라서, 실제로 저장된 요소의 개수는 변하지 않지만, displaySet(set); 메서드가 두 번 호출되므로 출력은 두 번 이루어집니다.
출력 설명:
첫 번째 displaySet(set); 호출 시에는 "사나", "나나", "가나", "다나"가 출력됩니다.
두 번째 set.add("가나"); 호출 후 다시 displaySet(set);을 호출하면, 중복된 "가나"는 저장되지 않으므로 출력 결과는 변하지 않습니다.
TreeSet도 마찬가지: TreeSet에서 중복된 "가나"를 추가하려고 할 때도 마찬가지로 중복이 허용되지 않으므로, 같은 요소가 두 번 추가되지 않게 됩니다.
class GirlMember {
private String name;
private int age;
//getter/setter 대신 생성자 생성
public GirlMember(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "GirlMember [name=" + name + ", age=" + age + "]";
}
//객체를 Set에 저장할 때 중복된 객체는 저장되지 않도록 하려면 hashCode(), equals()를 재정의하여야 한다.
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
/*if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())//getclass: 내객체 정보를 get클래스가 가져옴
return false;*/
//밑에 두줄만 있어도 됨
GirlMember other = (GirlMember) obj; //걸멤버를 대상obj와 비교
return age == other.age && Objects.equals(name, other.name); //문자열 비교
}
public static void main(String[] args) {
Set<GirlMember> set=new HashSet<>();//HashSet의 인스턴스가 생성되고, Set 인터페이스의 특성을 쓸 수 있음
GirlMember m1=new GirlMember("민지",23);
GirlMember m2=new GirlMember("다니엘",19);
GirlMember m3=new GirlMember("민지",23);
//GirlMember m3=m1;//주소가 같은 객체
//new로 새로 생김
set.add(m1);
set.add(m2);//m1과 m2를 비교함 hashCode의 리턴값같을떄 동일객체,
equals의 리턴값을 비교해서 같을경우 동등객체로 인지
set.add(m3);//m3와 m1,m2를 비교함 hash코드가 다름
HashSet은 hashCode(주소값)을 먼저 판단 후 equals(데이터값)를 판단
Iterator는 Java에서 컬렉션의 요소를 순회(traverse)하기 위한 인터페이스
주어진 코드에서 Iterator는 set 컬렉션의 요소들을 하나씩 접근하기 위해 사용됨.
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
set.iterator() : set 컬렉션에 대한 Iterator 객체를 생성
iterator.hasNext() : 다음 요소가 있는지를 확인
GirlMember girlMember = (GirlMember) iterator.next();
System.out.println(girlMember);
메서드를 호출하여 실제 요소를 가져온다음 출력함.
TreeSet
TreeSet<String> set2 = new TreeSet<>();//정렬된 Set
set2.add("사나");
set2.add("나나");
set2.add("가나");
set2.add("다나");
displaySet(set);
set2.add("가나");
displaySet(set2);
출력
private static void displaySet(Set<String> set) {
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
System.out.print(name+" ");
}
두 번씩 출력되는 이유
중복 요소 추가:
HashSet에 "가나"를 두 번 추가하고 있습니다. 첫 번째 추가는 정상적으로 이루어지지만, 두 번째 추가는 중복된 요소이기 때문에 저장되지 않습니다. 따라서, 실제로 저장된 요소의 개수는 변하지 않지만, displaySet(set); 메서드가 두 번 호출되므로 출력은 두 번 이루어집니다.
출력 설명:
첫 번째 displaySet(set); 호출 시에는 "사나", "나나", "가나", "다나"가 출력됩니다.
두 번째 set.add("가나"); 호출 후 다시 displaySet(set);을 호출하면, 중복된 "가나"는 저장되지 않으므로 출력 결과는 변하지 않습니다.
TreeSet도 마찬가지: TreeSet에서 중복된 "가나"를 추가하려고 할 때도 마찬가지로 중복이 허용되지 않으므로, 같은 요소가 두 번 추가되지 않게 됩니다.
Map
- 키(key,<K>)와 값(value,<V>)으로 구성
- 키와 값은 모두 객체이고 한
- 키는 중복X, 값은 중복 저장 가능
- HashMap, TreeMap 및 LinkedHashMap
Map.put(key, value)
HashMap<Integer,String> deptMap=new HashMap<>();
deptMap.put(10,"인사");
deptMap.put(20,"생산");
deptMap.put(30,"물류");
deptMap.put(40,"연구개발");
deptMap.put(50,"홍보");
System.out.println(deptMap.get(40));
모든 배열을 다 출력하는 법
①
for (Map.Entry<Integer, String> entry : deptMap.entrySet()) {
Integer key = entry.getKey();
String val = entry.getValue();
System.out.println(key+":"+val);
}
②
//키목록:Set keySet(); =>여기서 Set은 수정하는 의미
Set<Integer> keySet=deptMap.keySet();
for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
Integer key = (Integer) iterator.next();
String value=deptMap.get(key);//deptMap안에있는 key를 가져와서 value로 넣는다.
System.out.println(key+":"+value);
}
③key 순서대로 sort하여 출력
List<Integer>keyList=new ArrayList<>(keySet);
keyList.sort((a,b)->a-b); //asc
//keyList.sort((a,b)->b-a); desc
for (Iterator iterator = keyList.iterator(); iterator.hasNext();) {
Integer key = (Integer) iterator.next();
System.out.printf("%d:%s\n", key, deptMap.get(key));
}
Map초기화
deptMap.clear(); //Map초기화
if(deptMap.isEmpty())
System.out.println("자료가 없습니다.");
Queue
- java에서는 queue 클래스가 없다.>>LinkList로 구현한다. ∵큐는 Class 가 아니라 Interface
- 삽입연산자:add, enQueue(자료구조)
- 삭제연산자: poll, deQueue(자료구조) =>queue 에서 자료를 꺼낸다.객체를 큐에서 제거한다.
- peek(): 객체하나를 가져오나. 객체를 queue에서 제거하지 않는다.
- FIFO:선입선출, First Input First Output
Queue<String> queue=new LinkedList<>();
queue.add("일");
queue.add("월");
queue.add("화");
queue.add("수");
queue.add("목");
queue.add("금");
queue.add("토");
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
System.out.println(queue.poll()+queue.size());
Stack
- java에서는 queue 클래스가 없다.>>LinkList로 구현한다. ∵큐는 Class 가 아니라 Interface
- 삽입연산자: push
- 삭제연산자: pop size변경 - 마지막에 쌓인 스택부터 사라진다.
- peek(): 객체하나를 가져오나. 객체를 stack에서 제거하지 않는다.
- 후입선출(=LIFO(Last Input First Output))
Stack<String> stack=new Stack<>(); //<>:null데이터의 타입
stack.push("가나");
stack.push("나나");
stack.push("다나");
stack.push("라나");
stack.push("사나"); //사나 삽입
String name="";
name=stack.pop();
System.out.println(name); //사나 반환
System.out.println(stack.pop()); //라나 반환
System.out.println(stack.pop()); //다나 반환
System.out.println(stack.pop()); //나다 반환
System.out.println(stack.pop()); //가나 반환
System.out.println(stack.pop()); 삽입시
>>EmptyStackException 에러 발생
'JAVA' 카테고리의 다른 글
[java]Thread(스레드) (0) | 2024.08.26 |
---|---|
[java] 외부파일을 읽어서 출력하기(FileReader,BufferedReader,FileWriter,BufferedWriter) (0) | 2024.08.24 |
[java]class에 모든 기능을 구현해서 출력 (0) | 2024.08.22 |
[java]정렬하기(Sort), 람다식 (0) | 2024.08.21 |
[java] action , abstract, interface (0) | 2024.08.21 |