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);
}
}
}