본문 바로가기
공부기록

4월 24일 Java - Collection Framework, Iterator, 기타 객체들

by project100 2023. 4. 24.

Collection Framework

1. Set : 비순차구조, 중복불가(제거), HashSet 등

2. List : 순차구조, 중복허용, ArrayList 등

3. Map : 키와 값의 쌍으로 데이터를 묶는 구조, 키는 중복 불가, 값은 중복 허용, HashMap 등

 

Iterator 인터페이스

Collection의 순차적인 접근 방법을 제공하는 인터페이스

Set의 경우 Iterator를 사용하여 순차적으로 사용

List에서도 안전한 삭제를 위해 사용

 

- 주요 메소드

1) hasNext() : 다음 원소의 존재 유무 확인용 메소드

2) Next() : 해당 순번의 원소를 가져오는 메소드

3) remove() :  해당 순번의 원소를 삭제하는 메소드

 

문제_ 2를 전부 삭제하기

 

시도 1. 주소값 2가 지워짐

(어느 값이 지워지는 알기 위해 2를 7로 변경) 

시도1

 

 

 

시도 2. 맨 처음 만난 2가 지워짐

(어느 값이 지워지는 알기 위해 2를 7로 변경) 

시도2

 

 

 

시도 3. forEach문, 읽기 전용 에러발생

(어느 값이 지워지는 알기 위해 2를 7로 변경) 

 

 

 

 

 

시도 4. 일반 for문, 순번(주소값)이 바뀌면서 2가 전부 삭제되지 않음

 

 

 

> i값을 원래대로 만들어 주면 사용가능하지만, 배열이 바뀌기 때문에 사용하지 말자!

 

 

 

시도 5. iterator사용, 안전하게 삭제 가능

 

 

 

package list_ex;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListRemoveEx {
    public static void main(String[] args) {
        // 부모인터페이스 = 자식 인스턴스(힙영역에 저장)
        List<Integer> iList = new ArrayList<>();
        iList.add(1);
        iList.add(2);
        iList.add(2);
        iList.add(2);
        iList.add(2);
        iList.add(3);
        iList.add(4);
        iList.add(4);
        iList.add(5);
        iList.add(6);

        // 중복 값 허용
        System.out.println(iList);

        //문제! 모든 2를 지워라
        // 시도1. 순번, 주소값 2를 지움
//        iList.remove(2);
//        System.out.println(iList);

//        // 시도2.
//        iList.remove(new Integer(2));
//        System.out.println(iList);

        // 시도3. forEach 읽기전용 - 에러발생, 삭제 시 사용 금지
//        for(int n : iList){
//            if(n == 2){
//                iList.remove(new Integer(2));
//            }
//        }

        //시도4. 일반 for문 사용(가능하지만 하지 말자)
//        for (int i = 0; i < iList.size(); i++) {
//            if (iList.get(i) == 2) {
//                iList.remove(i);
//                i--;//i값의 증가를 다시 원위치로
//            }
//        }
//        System.out.println(iList);

        // 시도5. iterator 사용(안전한 삭제)
        Iterator<Integer> iter = iList.iterator();
        while(iter.hasNext()){
            if(iter.next() == 2){
                iter.remove();
            }
        }
        System.out.println(iList);
    }
}

 

Map(HashMap)

한 번에 두 데이터를 저장, 한 쌍으로 이루어진 데이터, 영단어 사전 단어 : 뜻

값을 키로 검색하여 사용하는 구조

 

인터페이스로 선언하고 Hash맵을 사용

Map<Key_Object, Value_Object> 맵이름

Key_Object : Integer, String 사용

Value_Object : 모든 객체, value에서 바로 키를 구할 수는 없음.

 

저장용 메소드 - put(key, value);

읽어오기 메소드 - get(key); 읽어오는 갑은 value. // 키를 집어넣어서 값을 꺼내오는 구조

package map_ex;

import java.util.*;

public class HashMapEx {
    public static void main(String[] args) {
        // 초간단 사전 : 단어 - 뜻, 비순서
        Map<String, String> dic = new HashMap<>();
        //dic(map) 데이터 입력 : put
        dic.put("One", "하나");
        dic.put("Apple", "사과");
        dic.put("Grape", "포도");
        dic.put("Pear", "배");
        dic.put("Ship", "배");//값은 중복 허용
        System.out.println(dic);

        // 키가 중복되면 이전 데이터를 덮어쓰기 한다.
        dic.put("Ship", "범선");//값이 덮어쓰기 되어 배->범선으로 변경
        System.out.println(dic);

        // map의 데이터 읽어오기 : get(key)
        System.out.println(dic.get("Apple")); //사과
        //값으로는 처리 불가, 키로만 가능
        // key에 해당하는 value가 없을 경우 null
        System.out.println(dic.get("사과")); // null

        // 키나 값의 존재 유무 확인 true/false
        // 키 - containsKey(key)
        boolean b = dic.containsKey("Banana"); //false
        System.out.println(b);
        // 값 - containsValue(value)
        b = dic.containsValue("배"); //true
        System.out.println(b);

        // key에는 어떤 것들이 있는가? 키집합 구하기
        // Integer, String 사용
        Set<String> kSet = dic.keySet();
        System.out.println(kSet);
        System.out.println(dic.get("One"));

        // 값의 집합 구하기 : values();
        // 모든 객체
        Collection<String> vSet = dic.values();
        System.out.println(vSet);

        // 응용 : 값을 가지고 키 구하기
        // 뜻으로 단어를 찾자!
        // 1. 찾고자 하는 값이 맵에 존재하는가?
        // 2. 키 집합을 생성한다.
        // 3. 키 집합을 순자구조로 변환(iterator)한다.
        // 4. 키 집합에서 하나씩 가져와서 해당 값을 읽어온다.
        // 5. 읽어온 값과 찾는 값을 비교한다.
        // 6. 같으면 -> 해당 키를 출력

        String s = "바나나";
        if (dic.containsValue(s)) {
            Set<String> keys = dic.keySet(); //키 집합 생성
            Iterator<String> kIter = keys.iterator(); //순차구조로 변환
            while (kIter.hasNext()) {
                String k = kIter.next(); // 키 집합에서
                String v = dic.get(k);  // 하나씩 꺼내와서
                if (v.equals(s)) { // 출력
                    System.out.println(s + "의 단어는 " + k);
                }
            }
        } else {
            System.out.println(s + "는(은) 사전에 없습니다.");
        }
    }
}

 

package map_ex;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DtoMapEx {
    public static void main(String[] args) {
        Map<String, DataDto> pMap = new HashMap<>();

        // 개별적인 데이터 묶음 생성
        DataDto d1 = new DataDto();
        d1.setName("홍길동");
        d1.setAge(25);
        d1.setAddress("인천시 남동구");

        pMap.put("hong01", d1);

        DataDto d2 = new DataDto();
        d2.setName("전우치");
        d2.setAge(30);
        d2.setAddress("인천시 미추홀구");

        pMap.put("june01", d2);

        System.out.println(pMap);
        System.out.println(pMap.get("hong01"));

        List<Integer> iList = new ArrayList<>();
        iList.add(1);
        iList.add(3);
        iList.add(5);
        iList.add(7);

        // Map에 List를 추가
        Map<String, List<Integer>> iMap = new HashMap<>();
        iMap.put("정수목록", iList);

        System.out.println(iMap.get("정수목록"));

        // List에 Map을 추가
        List<Map<String, DataDto>> localList = new ArrayList<>();
        localList.add(pMap);
        System.out.println(localList);
    }
}

 

 

 

기타 유용한 객체들

String(문자열) 관련 메소드

1) equals() :  두 문자열의 실제 데이터 비교

2) concat() : 두 문자열의 결합('+'와 같음) // 잘 사용되지 않는다.

3) charAt(n) : 지정된 위치(n)의 문자(char) 가져오기 //문자 하나만 가지고 오기

4) contains(str) : str이 있으면 true, 없으면 false //해당 str과 같은 값이 있는지 확인

5) indexOf(str, n) : str이 있으면 시작위치를, 없으면 -1 //5,, 9 합쳐서 많이 쓰임

   n - 검색 시작 위치 지정(생략 시 처음부터)

6) split(구분자) : 구분자에 따라 문자열을 문자 배열로 변환

7) replace(str1, str2) : 모든 str1을 str2로 변환

8) length() : 문자열의 길이

9) subString(st, ed) : st부터 ed의 직전까지의 문자열 추출

package string_ex;

public class StringEx {
    public static void main(String[] args) {
        // 문자열 생성방법
        String str1 = new String("hello"); //정식
        String str2 = "안녕"; //약식

        // 문자배열로 생성
        char ch[] = {'h', 'e', 'l', 'l', 'o'};
        String str3 = new String(ch);

        //StringBuffer를 사용하여 문자열 생성
        StringBuffer sb = new StringBuffer();
        sb.append("abc");
        sb.append("def");
        // 두번째 방법을 더 많이 사용.
        String str4 = new String(sb); // 첫번째
        String str5 = sb.toString(); // 두번째, 고정된 틀에 넣어서

        //---------------------------------
        System.out.println(str1.concat(" world"));
        //concat과 동일
        System.out.println(str1 + " world");
        // 문자열 중 문자를 하나 출력
        char c = str1.charAt(3);
        System.out.println(c);

        char carr[] = new char[str1.length()];
        // 문자 배열
        for(int i = 0; i < str1.length(); i++){
            carr[i] = str1.charAt(i);
        }
        // 문자배열을 하나씩 출력
        for(char ci : carr){
            System.out.println(ci);
        }
        System.out.println(carr);

        String str6 = "dog,cat,chicken,pig rabbit:bird-tiger";
        // 구분자 , 자르는 기준이 된다. 구분자가 여러개일 경우 []로 묶어준다.
        // 순서상관없으나 공백의 경우 마지막에 넣으면 오타로 처리되기 때문에 앞쪽에 넣어준다.
        // "" 공백이 없는 경우 한 글자로 된 문자열을 출력
        String strs[] = str6.split("[, :-]");
        System.out.println(strs); // 배열출력
        for(String s : strs){
            System.out.println(s);
        }

        String str7 = "aa0bbcc1aaee3ggaa9dd";
        String str8 = str7.replace("aa", "XX");
        System.out.println(str7);
        System.out.println(str8);

        // 시작하는 지점의 위치값(주소), 첫번째 일치하는 값만 찾아준다.
        System.out.println(str7.indexOf("aa"));
        // 1, 시작하는 위치값을 지정, 값이 없을 경우 -1출력
        System.out.println(str7.indexOf("aa", 1));

        // 범위 값 11직전까지만 출력
        String str9 = str7.substring(5, 11);
        String str10 = str7.substring(str7.indexOf("cc"), 11);
        System.out.println(str7);
        System.out.println(str9);
        System.out.println(str10);
    }
}