본문 바로가기
Programming Languages/Java

Chapter 24. 컬렉션

by 더 이프 2023. 1. 17.
728x90

목차

    1. 컬렉션

    ■ 컬렉션이란?

    • 컬렉션 프레임워크는 자바의 인터페이스를 사용하여 구현
    • 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 클래스의 집합
    • 데이터를 저장하는 자료 구조 및 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현

    ■ 종류

    • List 인터페이스
    • Set 인터페이스
    • Map 인터페이스

     

    2. List 클래스

    ■ List 클래스란?

    • List 인터페이스를 구현한 모든 List 컬렉션 클래스
    • 요소의 저장 순서가 유지
    • 같은 요소의 중복 저장을 허용

    ■ 종류

    • ArrayList<E>
    • LinkedList<E>
    • Vector<E>
    • Stack<E>

     

    3. Set 클래스

    ■ Set 클래스란?

    • Set 인터페이스를 구현한 모든 Set 컬렉션 클래스
    • 요소의 저장 순서를 유지하지 않음
    • 같은 요소의 중복 저장을 허용하지 않음

    ■ 종류

    • HashSet<E>
    • TreeSet<E>

     

    4. Map 클래스

    ■ Map 클래스란?

    • Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식임
    • Key와 Value를 하나의 쌍으로 저장하는 방식인 Key - Value 방식을 사용
    • Key는 Set 클래스 특성, Value는 List 클래스 특성을 가짐
    • 요소의 저장 순서를 유지하지 않음
    • Key는 중복을 허용하지 않지만, Value는 중복 허용

    ■ 종류

    • HashMap<K, V>
    • HashTable<K, V>
    • TreeMap<K, V>

     

    5. 예시

    ■ ListStringMain

    package j19_컬렉션;
    
    import java.util.ArrayList;
    
    public class ListStringMain {
    
    	public static void main(String[] args) {
    
    		String[] strArray = new String[] { "java", "python", "C++" };
    
    		String[] newStrArray = new String[strArray.length + 1];
    
    		for (int i = 0; i < strArray.length; i++) {
    			newStrArray[i] = strArray[i];
    		}
    		newStrArray[strArray.length] = "html";
    
    		System.out.println("[strArray]");
    		for (String str : strArray) {
    			System.out.println(str);
    		}
    		System.out.println();
    
    		System.out.println("[newStrArray]");
    		for (String str : newStrArray) {
    			System.out.println(str);
    		}
    		System.out.println();
    		/////////////////////////////////////////////////////
    //		List는 유동적으로 인덱스 정리까지 해줌
    //		자료구조와 알고리즘
    		ArrayList<String> strList = new ArrayList<String>();
    		strList.add("java"); // 추가
    		strList.add("python");
    		strList.add("python");
    		strList.remove("java"); // 삭제
    		strList.add(1 , "java");// 몇번 인덱스에 뒤의 내용을 집어넣음
    		strList.remove(1);
    		
    //		위와 동일 하지만 잘 사용하지 않음
    //		ArrayList<?> strList = new ArrayList<>();
    //		((ArrayList<String>)strList).add("java");
    //		strList.add("python");
    		
    		for (int i = 0; i < strList.size(); i++) {
    			System.out.print("[" + i + "] : ");
    			System.out.println(strList.get(i));
    		}
    		
    		for (String str : strList) {
    			System.out.println(str);
    		}
    		
    	}
    }

    ■ ArrayListMain

    package j19_컬렉션;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.List;
    
    public class ArrayListMain {
    	
    	/**
    	 * 
    	 * CRUD
    	 * 
    	 * C reate
    	 * R ead
    	 * U pdate
    	 * D elete
    	 * 
    	 */
    	public static void main(String[] args) {
    		
    //		항상 업캐스팅하여 사용함
    		List<String> strList = new ArrayList<>();
    		
    //		*값 추가
    		strList.add("java");
    		strList.add("python");
    		System.out.println(strList);
    		
    //		값 원하는 위치에 추가
    		strList.add(1, "android");
    		System.out.println(strList);
    		
    //		*해당 인덱스의 값을 추출
    		System.out.println(strList.get(0));
    		String lang = strList.get(1);
    		System.out.println(lang);
    		
    //		리스트에 해당 값이 있는지 확인(T, F)
    		System.out.println(strList.contains("c++"));
    		System.out.println(strList.contains(lang));
    		
    //		값 수정
    		strList.set(2, "javascript");
    		System.out.println(strList);
    		
    //		*값 삭제
    		strList.remove("android");
    		System.out.println(strList);
    		strList.remove(1);
    		System.out.println(strList);
    		
    //		*리스트의 크기 확인
    		System.out.println(strList.size());
    		
    //		리스트가 비었는지 확인
    		System.out.println(strList.isEmpty());
    		
    //		리스트 초기화
    		strList.clear();
    		System.out.println(strList.isEmpty());
    		
    		/*
    		 * *배열을 리스트로 변환
    		 * Arrays.asList(배열);
    		 */
    		String[] langs = {"java", "c++", "python", "javascript"};
    		List<String> tempList = Arrays.asList(langs);
    		strList.addAll(tempList);
    		strList.addAll(2, tempList);
    		System.out.println(strList);
    		
    //		*해당 값의 위치(index) 왼쪽부터 찾기
    		int findIndexLeft = strList.indexOf("python");
    		System.out.println(findIndexLeft);
    		
    //		*해당 값의 위치(index) 오른쪽부터 찾기
    		int findIndexRight = strList.lastIndexOf("java");
    		System.out.println(findIndexRight);
    		
    //		========================================================
    		
    		strList.set(1, "java");
    		System.out.println(strList);
    		strList.subList(strList.indexOf("java") + 1, strList.size()).indexOf("java");
    		
    		
    //		========================================================
    //		fromIndex부터 toIndex전까지 리스트를 추출
    		List<String> subList = strList.subList(1, 4);
    		System.out.println(subList);
    		System.out.println();
    		
    //		================반복================
    //		일반 반복문
    		for (int i = 0; i < strList.size(); i++) {
    			System.out.println("[" + i + "] : " + strList.get(i));
    		}
    		System.out.println();
    		
    //		forEach
    		for (String str : strList) {
    			System.out.println("[값]" + str);
    		}
    		
    //		람다식 forEach
    		strList.forEach(str -> System.out.println("[값2] : " + str));
    		System.out.println();
    		
    //		반복자
    		Iterator<String> iterator = strList.iterator();
    //		iterator의 다음 값이 있는지 확인하는 것이 hasNext
    //		한 번 실행하여 값을 다 꺼내면 안에 데이터가 없으므로 일회용으로 사용
    		while(iterator.hasNext()) {
    //			iterator의 다음 값을 꺼내 반환하는 것이 next
    			String lang2 = iterator.next();
    			System.out.println("[값3] : " + lang2);
    		}
    		
    //		다시 사용하기 위해서는 다시 대입하여 사용
    		iterator = strList.iterator();
    		while(iterator.hasNext()) {
    			String lang2 = iterator.next();
    			System.out.println("[값3] : " + lang2);
    		}
    	}
    }

    ■ ArrayUserMain

    package j19_컬렉션;
    
    import java.util.Arrays;
    import java.util.List;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    @AllArgsConstructor
    @Data
    class User {
    	private String username;
    	private String name;
    }
    
    public class ArrayUserMain {
    
    	public static void main(String[] args) {
    
    		User[] userArray = {
    				new User("aaa", "김종환"),
    				new User("bbb", "고병수"),
    				new User("ccc", "손민재"),
    				new User("ddd", "황창욱"),
    		};
    
    		List<User> userList = Arrays.asList(userArray);
    
    		String searchUsername = "aaa";
    
    		User user = searchUser(userList, searchUsername);
    		
    		if(user == null) {
    			System.out.println("검색실패!");
    			System.out.println("존재하지 않는 계정입니다");
    		} else {
    			System.out.println("검색성공!");
    			System.out.println(searchUsername + "계정의 회원 이름은 " + user.getName() + "입니다.");
    		}
    		
    		
    		boolean flag = true;
    
    		for (User user2 : userList) {
    			if (user2.getUsername().equals(searchUsername)) {
    				System.out.println("검색성공! " + searchUsername + "계정의 회원 이름은 " + user2.getName() + "입니다.");
    				flag = false;
    				break;
    			}
    		}
    
    		if (flag) {
    			System.out.println("검색실패! 존재하지 않는 계정입니다.");
    		}
    
    	}
    	
    	public static User searchUser(List<User> userList, String username) {
    		User user = null;
    		
    		for(User u : userList) {
    			if(u.getUsername().equals(username)) {
    				user = u;
    				break;
    			}
    		}
    		
    		return user;
    	}
    }

    ■ SetStringMain

    package j19_컬렉션;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    public class SetStringMain {
    
    	public static void main(String[] args) {
    //		Hash값을 가지고 정렬한것이라 순서가 뒤죽박죽임
    		Set<String> setStr = new HashSet<>();
    		List<String> listStr = new ArrayList<>();
    		
    		listStr.add("임나영");
    		listStr.add("이강용");
    		listStr.add("임나영");
    		listStr.add("임나영");
    		
    		System.out.println(listStr);
    		
    		
    //		중복이 되지 않아 같은 값을 아무리 추가해도 하나로 나옴
    		setStr.add("김상현");
    		setStr.add("강대협");
    		setStr.add("손지호");
    		setStr.add("최해혁");
    		setStr.add("최해혁");
    		setStr.addAll(listStr);
    		
    		System.out.println(setStr);
    		String searchName = "손지호";
    		
    		// get이 없기 때문에 값을 직접 비교
    		for (String name : setStr) {
    			if(name.equals(searchName)) {
    			System.out.println(name);
    			}
    		}
    		
    //		람다식을 모르면 map에서 반복을 돌릴수 있는 방법은 iterator밖에 없음
    		Iterator<String> iterator = setStr.iterator();
    		while(iterator.hasNext()) {
    			String n = iterator.next();
    			if(n.equals(searchName)) {
    				System.out.println(n);
    			}
    		}
    	}
    }

    ■ HashMapTest

    package j19_컬렉션;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class HashMapTest {
    
    	public static void main(String[] args) {
    
    		Map<String, Object> dataMap = new HashMap<>();
    		dataMap.put("username", "aaa");
    		dataMap.put("password", "1234");
    		dataMap.put("name", "김준일");
    		dataMap.put("email", "aaa@gmail.com");
    
    		List<String> hobby = new ArrayList<>();
    		hobby.add("골프");
    		hobby.add("축구");
    		hobby.add("농구");
    		hobby.add("음악감상");
    
    		dataMap.put("hobbys", hobby);
    
    		System.out.println(dataMap);
    		
    		List<String> list = (List<String>) dataMap.get("hobbys");
    		System.out.println(list.get(0));
    	}
    }

    ■ MapStringMain

    package j19_컬렉션;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    
    public class MapStringMain {
    
    	public static void main(String[] args) {
    //		Map에는 Entry가 들어감
    //		Entry는 key와 value를 가짐
    		Map<String, String> strMap = new HashMap<>();
    
    		strMap.put("이종현", "a");
    		strMap.put("진채희", "b");
    		strMap.put("김재영", "c");
    		strMap.put("이상현", "d");
    
    		System.out.println(strMap);
    
    		System.out.println(strMap.get("a"));
    		System.out.println(strMap.get("e"));
    
    //		keySet은 key값을 set으로 뽑아낼 수 있음
    //		뽑아낸 key값을 가지고 반복을 돌림
    		for (String k : strMap.keySet()) {
    			System.out.println("key : " + k);
    			System.out.println(strMap.get(k));
    		}
    //		값은 key의 Hashcode값의 정렬에 따라 순서가 바꿔서 나올수 있음
    		for (String v : strMap.values()) {
    			System.out.println("value: " + v);
    		}
    		
    		Set<Entry<String, String>> s = null;
    		
    		for (Entry<String, String> entry : strMap.entrySet()) {
    			System.out.println(entry);
    			System.out.println("key : " + entry.getKey());
    			System.out.println("value : " + entry.getValue());
    		}
    		
    		System.out.println("===================람다식====================");
    		strMap.forEach((k, v) -> {
    			System.out.println("key : " + k);
    			System.out.println("value : " + v);
    		});
    	}
    }

    ■ Student

    package j19_컬렉션;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    //@NoArgsConstructor // 기본 생성자
    //@RequiredArgsConstructor // 필수 생성자
    /*
     * @Data에 전부 포함
     * @Getter
     * @Setter
     * @EqualsAndHashCode
     * @ToString
     */
    
    @AllArgsConstructor // 전체 생성자
    @Data
    public class Student {
    	
    	@Getter // 특정 변수의 Getter가 필요할 시 변수의 위에 작성 //target으로 지정한 곳 위에 사용 가능
    	private String name; // 이름
    	private int year; // 학년
    //	private final String address;
    }

    ■ StudentArrayList

    package j19_컬렉션;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class StudentArrayList {
    
    	public static void updateYear(List<Student> students, String searchName, int newYear) {
    		
    		for (Student student : students) {
    			if(student.getName().equals(searchName)) {
    				student.setYear(newYear);
    				return; // void인 상태에서 return을 만나면 실행중인것에서 벗어나며 그 다음줄을 실행
    			}
    		}
    		
    		System.out.println("검색 실패!");
    	}
    	
    	public static void main(String[] args) {
    		
    		List<Student> students = new ArrayList<>();
    		students.add(new Student("김종환", 1));
    		students.add(new Student("고병수", 2));
    		students.add(new Student("손민재", 3));
    		students.add(new Student("황창욱", 4));
    		
    //		System.out.println(students);
    		
    //		System.out.println(students.get(0).getName());
    		
    		String searchName = "손민재";
    //		이름이 searchName인 학생을 찾아서 학년을 4학년으로 바꿔라
    //		만약 searchName 동일한 이름이 없으면 "검색실패" 메세지 출력
    
    		boolean flag = true;
    		
    		for(int i = 0; i < students.size(); i++) {
    			Student student = students.get(i);
    			if(student.getName().equals(searchName)) {
    				student.setYear(4);
    				flag = false;
    				break;
    			}
    		}
    		
    		if(flag) {
    			System.out.println("검색 실패!!!");
    		}
    		System.out.println(students);
    		
    		for (Student student : students) {
    			if(student.getName().equals(searchName)) {
    				student.setYear(4);
    				flag = false;
    				break;
    			}
    		}
    		
    		if(flag) {
    			System.out.println("검색 실패!!!");
    		}
    		System.out.println(students);
    		
    //////////////////////////////////////////////////////////////
    		
    		updateYear(students, "손민재", 1);
    		System.out.println(students);
    		
    	}
    }

    ■ StudentHashSet

    package j19_컬렉션;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class StudentHashSet {
    
    	private static Student searchStudent(Set<Student> students, String searchName) {
    		Student student = null;
    
    		for (Student s : students) {
    			if (s.getName().equals(searchName)) {
    				student = s;
    				break;
    			}
    		}
    
    		return student;
    	}
    
    	public static void main(String[] args) {
    
    		Set<Student> students = new HashSet<>();
    
    		students.add(new Student("이현수", 26));
    		students.add(new Student("정의현", 24));
    		students.add(new Student("김수현", 31));
    		students.add(new Student("이종현", 32));
    
    		System.out.println(students);
    
    		Student student = searchStudent(students, "김수현");
    
    		if (student == null) {
    			System.out.println("검색실패!");
    		} else {
    			System.out.println("검색성공!" + student);
    		}
    	}
    }