[java]Collection Framework

2024. 8. 22. 23:44·JAVA

20240822수업

Java Collection Framework 구조

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
'JAVA' 카테고리의 다른 글
  • [java]Thread(스레드)
  • [java] 외부파일을 읽어서 출력하기(FileReader,BufferedReader,FileWriter,BufferedWriter)
  • [java]class에 모든 기능을 구현해서 출력
  • [java]정렬하기(Sort), 람다식
라텐느
라텐느
이제 막 개발을 시작한 초보가 개인공부를 하는 공간입니다.
  • 라텐느
    괴발개발
    라텐느
    • 개발자 (150)
      • HTML|CSS (14)
      • JAVA (29)
      • JAVACSCRIPT (15)
      • SQL (15)
      • 기타 (6)
      • JSP (2)
      • SPRING (13)
      • SPRING BOOT (6)
      • Git&GitHub (1)
      • 시행착오 (2)
      • 개발일지 (35)
        • GreenMiniProject1 (12)
        • GreenMiniProject2 (9)
        • GreenFinalProject (14)
      • Flutter (5)
      • 자격증 (1)
        • SQLD (1)
      • AWS (2)
      • Linux (1)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 태그
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    오블완
    SQL
    java
    AJAX
    링크
    input
    tag
    부트캠프
    CSS
    HTML
    javascript
    JQuery
    link
    db
    JS
    티스토리챌린지
    일지
    태그
    개발자
    자기계발
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
라텐느
[java]Collection Framework
상단으로

티스토리툴바