자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로
처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.
즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로
구현해 놓은 것입니다. 이러한 컬렉션 프레임워크는 자바의 인테페이스(interface)를
사용하여 구현됩니다.
List 인터페이스 계열 - 1
자바에서 데이터를 순서대로 저장하고 관리할 수 있도록 설계된 인터페이스입니다.
자바의 java.util 패키지에 속하며, 배열이나 연결 리스트 등의 순차적 자료 구조의
구현체를 위한 메서드를 정의합니다.
List 인테페이스의 주요 특징
1.순서 유지 : (List) 인터페이스를 구현하는 자료 구조는 원소들이 삽입된 순서를 유지합다.
이는 원소들이 리스트 내에서 특정위치(index)를 가지며, 이 인덱스를 통해 접글할 수 있다는 것을 의미합니다.
2.중복 허용 : (List)는 같은 값을 가진 원소의 중복 저장을 허용합니다. 예를 들어, 같은 값을 여러 번 리스트에
추가할 수 있으며, 이는 리슼크의 크기를 증가시키고 각각의 원소는 별도의 인덱스를 갖게 됩니다.
3.가변 크기 : (List)의 구현체들은 동적으로 크기가 조절됩니다. 즉, 원소를 추가하거나 제거함에 따라
리스트의 크기가 자동으로 조정됩니다.
주요 메서드
add(E element) : 리스트의 끝에 원소를 추가합니다.
get(int index) : 지정된 위치의 원소를 반환합니다.
remove(int index) : 지정된 위치의 원소를 제거하고 그 원소를 반환합니다.
indexOf(object o) :지정된 객체가 처음으로 나타나는 위치의 인덱스를 반환합니다.
객체가 리스트에 포함되어 있지 않은 경우 -1을 반환합니다.
size() : 리스트에 있는 원소의 수를 반환합니다.
List인테페이스 구현체

- Collection : 모든 컬렉션 클래스의 최상위 인터페이스입니다.
-List : Collection 인터페이스를 확장하는 순서가 있는 컬렉션을 위한 인터페이스 입니다.
리스트는 중복을 허용하며, 각 요소가 삽입된 순서에 따라 인덱스로 접근할 수 있습니다.
-ArrayList : 내부적으로 배열을 사용하여 요소를 관리하는 List 구현체입니다.
요소의 무작위 접근이 빠르다는 장점이 있습니다.
-LinkedList : 내부적으로 연결 리스트를 사용하여 요소를 관리하는 List 구현체입니다.
요소의 삽입과 삭제가 빠르다는 장점이 있습니다.
-vector : ArrayList와 유사하지만, 모든 메서드가 동기화되어 있어 멀티 스레드 환경에서 안전하게 사용할 수 있습니다.
package collections;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
public class MyArrayListTest {
public static void main(String[] args) {
List mList; // 리스트 인터페이스(계열)
int[] arrayInt = new int[10];
ArrayList<Integer> list = new ArrayList();
// <T> <- 제네릭이란 문법
//Integer, int (기본 데이터 타입)
//Imteger - wrap클래스 int 기본 데이터 타입을
//클래스로 설계해둔 데이터 타입
//ArrayList<Interger> list -> 정수값을 하나의 변수에저장하는 리스트 계열에 자료구조를 생성
//1. 값을 추가하는 방법
//arrayInt[0] = 100;
list.add(100);
list.add(null); // [100][null]
list.add(200);
//2. 값 꺼내기
//System.out.println(arrayInt[0]);
System.out.println(list.get(0));
//3.값 삭제하기
list.remove(1);
//3.1삭제 후 전체 출력하기
System.out.println(list.toString());
//4.값 인덱스 번호로 지정해서 값 추가하기
list.add(1,1000);
System.out.println("출력확인 : " + list);
//4.1 수정은 없고 삭제 처리해야함
list.remove(2); // 인덱스 번호로 삭제
// Object값으로도 삭제가능
System.out.println("출력확인 2: " + list);
//5.전체 삭제
list.clear();
System.out.println("출력확인 3: " + list);
//6. 리스트의 사이즈를 확인
// arrayInt.length; - 변수
System.out.println("size확인 : "+list.size()); //list.size() - 메서드
// nums 참조 변수에 list 참조 변수에 주소값을 대입시킨것
System.out.println("---------------------------------------");
System.out.println("list : " + list);
//주소값을 복사 했다. ----> 얕은 복사 개념
ArrayList nums = list;
System.out.println("새로 선언한 nums 에 값을 추가했다.");
nums.add(10);
nums.add(500);
// nums 라는 변수로 접근해서 add ()를 했는데 다시 list 출력하면 데이터가 존재 하고 잇지?
System.out.println("list : " + list);
System.out.println("nums : " + nums);
System.out.println("리스트의 값 존재 여부 확인 : " + nums.contains(10));
System.out.println("리스트의 요소의 위치(index) 확인 : " + nums.indexOf(500)); //배열의 위치확인
for(int i = 0; i < nums.size(); i++){
//num[i] <--- 배열 방식
System.out.println(nums.get(i));
}
} // end of main
}
Set 계열 인터페이스 - 2
JAVA에서 Set 인터페이스는 java.util 패키지의 일부로, 중복을 허용하지 않는 우일한
요소들을 저장하는데 사용됩니다. 이 인터페이스는 컬렉션 프레임워크의 일부이며,
순서에 의존하지 않는 데이터 집합을 관리하기 위해 설계되었습니다.
주요 특징
1.중복 허용 불가 : Set에 같은 요소를 추가하려고 하면, 추가가 되지 않습니다. 즉, 모든 요소가 고유해야 하며,
이미 존재하는 요소를 추가할 경우 무시됩니다.
2.순서 보장하지 않음 : Set은 요소들의 순서를 유지하지 않습니다. 요소들이 내부적으로 어떻게 저장되고
관리되는지 Set을 구현하는 클래스에 따라 다릅니다.
따라서 요소들이 추가된 순서와 Set에서 요소를 순회할 때의 순서가 다를 수 있습니다.
3.값의 유일성 : Set은 각 요소의 유일성을 보장합니다. 이는 주로 요소의 equals()와 hashCode()메서드를 사용하여
결정됩니다. 두 객체가 같다고 판단되면, 둘 중 하나만 Set에 저장됩니다.
사용 예시
-아이디 목록 관리 : 사용자 아이디는 유일해야하므로 Set을 사용하여 중복 없이 관리할 수 있습니다.
-주민등록번호 : 각 사람의 주민등록번호는 고유한 값이므로, 이를 Set에 저장하여 중복 등록을 방지할 수 있습니다.
-직원 번호 : 회사에서 각 직원에게 부여한 고유한 사번을 Set을 이용해 관리할 수 있습니다.

주요 메서드
Set 인테페이스는 JAVA Collection Framework 내에서 중복을 허용하지 않는 유니크한
아이템들을 저장하는데 사용됩니다.
1. add(E e) : 지정된 요소를 세트에 추가합니다. 요소가 세트에 이미 존재하는 경우는 추기되지 않습니다.
- boolean add(E e);
-반환값 : 요소가 세트에 성공적으로 추가되면 true, 이미 존재하는 경우는 false를 반환합니다.
2. remove(Object o) : 지정된 요소를 세트에서 제거합니다.
-boolean remove(object o);
-반환값 : 요소가 세트에서 성공적으로 제거되면 true, 그렇지 않으면 false를 반환합니다.
3. contains(Object o ) : 세트가 지정된 요소를 포함하고 있는지 여부를 확인합니다.
- boolean contains(object o);
-반환값 : 요소가 세트에 존재하면 true, 그렇지 않으면 false 를 반환합니다.
4.size() : 세트에 저장된 요소의 수를 반환합니다.
- int size();
-반환값 : 세트에 있는 요소의 총 수를 반환합니다.
5.isEmpty(): 세트가 비어 있는지 여부를 확인합니다.
boolean isEmpty();
반환값 : 세트가 비어 있으면 true,하나 이상의 요소가 있으면 false를 반환합니다.
6.clear(): 세트에서 모든 요소를 제거합니다.
-void clear();
-이 메서드는 세트를 비워서 요소가 없는 상태로 만듭니다.
7.iterator() : 세트의 요소에 접근할 수 있는 반복자(iterator)를 반환합니다.
- Iterator<E> interator();
- 이 반복자를 사용하여 세트의 요소를 순차적으로 접근할 수 있습니다.
package collections;
import java.util.*;
public class MySetText {
public static void main(String[] args) {
// 계층 구조 확인(업캐스팅된 상태)
Set<Integer> mTestSet = new HashSet<>();
//사용방법
// HashSet : 중복된 요소를 허용하지 않고, 순서가 없는 자료 구조
HashSet<Integer> numberSet = new HashSet<>();
//요소 추가 하기
numberSet.add(500);
numberSet.add(11);// 추가되지않음 중복 값
numberSet.add(200);
numberSet.add(33);
numberSet.add(355);// 추가되지않음 중복 값
System.out.println("numberSet의 크기 :" + numberSet.size());
//요소 제거
numberSet.remove(1);//1이란 요소 자체를 삭제 // remove 할때 없는 요소 삭제하더라 오류발생 ㄴㄴ함
System.out.println("numberSet의 크기 :" + numberSet.size());
//자료구조는 반복문과 함께 많이 사용이 된다.
// for (int i = 0; i < ; i++) {}- 인덱스 구문 사용불가
//향상된 for문 set계열의 데이터르르순화 시킬 수 있다.
for( Integer num : numberSet){
System.out.println("num 값 확인 :" + num);
}
//set 계열을 Iterator 타입으로 변환해서 순회 시킬 수 있었다, 지금도 가능
System.out.println("------------------------------------------------");
Iterator<Integer> iter = numberSet.iterator();// 형 변환 처리 set--> Iterator 형 변환
while(iter.hasNext()){
System.out.println("값 : " + iter.next());// next() 요소를 반환 처리 한다.
}
System.out.println("----------------------------------");
// Set 계열 자료 구조 선언(정수값만 담으 수 있고 중복 허용 가능)
HashSet<Integer> lottoNumbers = new HashSet<>();
while(lottoNumbers.size() < 6 ){
lottoNumbers.add(getRandomNumber());
}
System.out.println("무작위로 선택된 로또 번호 6개 : " + lottoNumbers.toString());
// HashSet 데이터 타입을 ArrayList 객체 생성시에 즉 생성지에 인자값을 넣을 수 있도록 설계됨
ArrayList<Integer> sortedList = new ArrayList<>(lottoNumbers);
// 정렬하기 기능 사용해보기
Collections.sort(sortedList);
System.out.println("정렬된 로또 번호 확인 : " + sortedList);
}// end of main
// 무작위 1 부터 45까지 랜덤 번호 생성 함수
public static int getRandomNumber(){
Random random = new Random();
return random.nextInt(45) + 1 ;
}
}// end of class
도전 학습
예제 개념: 고유 사용자 ID 관리 시스템
상황 설명 : 웹 사이트에 접속하는 사용자의 ID를 관리하는 시스템을 개발합니다. 사용자 ID는 고유해야 하며
중복을 허용하지 않습니다. 시스템은 사용자가 로그인할 때마다 ID를 체크하고, 새로운 사용자ID를 등록할때 중복을
방지합니다.
도전과제 추가 - 사용자 ID를 출력하는 메서드를 직접 만들어 보자
package collections;
import java.util.HashSet;
import java.util.Scanner;
public class UniqueUserIDSystem {
// 상황 -> 사용자가 키보드로 압력한 ID데이터를 많이 저장해야한다.
//고유한 값이여야한다. 메모리상으로 관리할 예정
private HashSet<String> registerdIDs;
public UniqueUserIDSystem(){
registerdIDs = new HashSet<>();
// printAllIDs 메서드를 테스트 하기 위해서 샘플 테이터 입력해보기
//샘플 데이터 입력 - 추후 삭제 예정
registerdIDs.add("홍길동");
registerdIDs.add("이순신");
registerdIDs.add("야스오");
}
// 사용자 ID를 등록하는 메서드
public boolean addUserId(String userId){
return registerdIDs.add(userId);
}
//사용자 ID를 출력하는 메서드를 직접 만들어 보자. - 전체 출력
// 메서드 이름을 동사로 시작하는 것이 권장사항이다.
public void printAllIDs(){
// registerdIDs 순회해서 콘솔창에 출력하고자 한다.
// 초기화 for 구문, Iterator 로 형변환해서 순회를 시킬 수 있다.
//HashSet 안에 요소가 아무것도 없다면
if(registerdIDs.isEmpty()){
System.out.println("등록된 사용자 ID가 없습니다.");
return; // 실행에 제어권 반납
}
for( String id : registerdIDs){
System.out.println("id : " + id);
}
System.out.println("총 등록된 ID 갯수 " + registerdIDs.size());
//for( string id : registerdIDs){
// System.out.println("id : " + id);
//}
//System.out.println(" 총 등록된 ID 갯수 : " + refisterdIDs.size )
}
// 시스템을 실행할 메서드
public void start(){
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("사용하고 싶은 ID를 입력하세요 종료하시려면 'exit' 입력");
String input = scanner.nextLine().trim();//trim() 공백 제거
//사용자가 키보드에서 값을 넣지 않고 바로 엔터 누르는 경우
// 비 입력 처리
if(input.isEmpty()){
System.out.println("ID를 입력해주세요");
continue;
}
if("exit".equals(input)){
System.out.println("시스템을 종료 합니다.");
break;
}
boolean isRegisterd = addUserId(input);
if(isRegisterd){
System.out.println("새로운 사용자ID가 등록되었습니다");
}else{
System.out.println("이미 등록돤사용자 ID 입니다");
}
}//end of while
scanner.close();//자원 해제
}// end of start
//메인함수
public static void main(String[] args) {
UniqueUserIDSystem idSystem = new UniqueUserIDSystem();
// idSystem.start();
//idSystem.printAllIDs(); //
}
}// end of class
Map 계열 인터페이스 - 3
Map은 키(key)와 값(value)을 연관시키는 자료구조입니다. 이는 사전과 유사한 구조로, 각 키는 고유한 값을 가집니다.
Java에서 Map은 인터페이스로 정의되어 있으며, 이를 구현한 여러 가지 클래스가 있습니다.
Map 주요 특징
1.키 -값 저장 : Map은 키(Key)와 값(value)의 쌍으로 데이터를 저장합니다.
각 키는 고유해야하며, 하나의 값에만 매핑됩니다.
2.중복 키 불가 : Map은 각 키가 고유해야 합니다. 따라서 동일한 키를 두 번 이상 추가할 수 없습니다.
키의 유일성은 Map내에서 보장됩니다.
3.순서 보장하지 않음 : Map은 키-값 쌍을 저장하는데 순서를 유지하지 않습니다. 따라서 Map에 저장된순서와
데이터를 순회할 때의 순서는 일치하지 않을 수 있습니다.
Map 주요 기능 및 메서드
1. 키-값 저장 :Map은 키와 값을 쌍을 저장합니다.
메서드 put(key, value)
-설명 : 지정된 키와 값을 매핑하여 Map에 저장합니다.
-반환값 : 이전에 키에 매핑되어 있던 값, 없으면 null을 반환합니다.
2.데이터 검색: 주어진 키를 사용하여 매핑된 값을 검색합니다.
메서드 : get(key)
-설명 : 지정된 키에 매핑되어 있는 값을 반환합니다.
-반환값 : 지정된 키에 매핑되어 있는 값,없으면 null을 반환합니다.
3.데이터 추가 및 갱신 : 새로운 키-값 쌍을 추가하거나, 기존 키에 매핑된 값을 갱산합니다.
-메서드 :put(key, value)
-설명 : 지정된 키와 값을 매핑하여 Map에 저장합니다.
이미 존재하는 키인 경우 해당 키에 새로운 값을 덮어씁니다.
-반환값 : 이전에 키에 매핑되어 있던 값, 없으면 null을 반환합니다.
4.데이터 삭제 : 특정 키에 해당하는 값을 삭제합니다.
메서드 : remove(key)
-설명 : 지정된 키에 매핑되어 있는 값을 제거합니다.
-반환값 : 지정된 키에 매핑되어 있던 값, 없으면 null을 반환합니다.
5.크기 확인 : Map의 크기 (키- 값 쌍의 수)를 반환합니다.
메서드 : size()
설명 : Map에 포함되 키 -값 쌍의 수를 반환합니다.
반환값 : Map에 포함된 키-값 쌍의 수를 반환합니다.

package collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) {
//계층구조 확인
Map<String, String> map;
//Map 계열 자료 구조 객체 선언과 동시에 초기화
Map<String, String> books = new HashMap<>();
// C R U D
//데이터 추가
books.put("해리포터","J.K.롤링");
books.put("반지의제왕","J.R.R 톨킨");
books.put("1984","조지오웰");
//데이터 조회: 특정 키 값으로 value를 읽어 보기
String value1 = books.get("해리포터");
System.out.println("value1 : " + value1);
String value2 = books.get("해리포터2");
System.out.println("value2 : " + value2);//없는 키값을 입력하면 null값을 반환
//데이터 수정하기
books.put("1984","업데이트 됨");
System.out.println(books.get("1984"));
//데이터 삭제하기
books.remove("반지의제왕");
//size()확인
System.out.println("Map size() 확인 : " + books.size());
//키 값을 확인하는 메서드 제공 됨
System.out.println("keyset() : " + books.keySet());
System.out.println("------------------------------");
//향상된 for 구문
for(String key : books.keySet()){
System.out.println("key 값 확인 : " + key);
System.out.println("value 값 확인 (key 활용)" + books.get(key));
}
//Interator를 활용해서 순회시켜보자.
Iterator<Map.Entry<String,String>> iter = books.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String,String> entry = iter.next();
System.out.println("key : " + entry.getKey() + ", value : " + entry.getValue());
}
System.out.println("Map(books)의 크기를 반환 : " + books.size());
//전체 요소 삭제
books.clear();
}//end of main
}//end of class
package collections;
import java.util.HashMap;
import java.util.Map;
public class UserMapAddSystem {
private Map<String, User> user;
public UserMapAddSystem() {
user = new HashMap<>();
}
// users 접근해서 데이터 추가하는 기능 만들어 보기
public void addUser(String name, String email) {
// 1. map 자료구조에 넣어야한다.
//2. 키값을 명시하고 value에는 User Object 들어 가야 한다.
//User u1 = new User(name, email);
user.put(name, new User(name, email));
}
// users에 접근에서 전체 데이터를 출력하는 기능을 만들어보자.
public void printAllUser() {
for (User u : user.values()) {
System.out.println(u.toString());
}
}
//메인 함수
public static void main(String[] args) {
UserMapAddSystem userMapAddSystem = new UserMapAddSystem();
userMapAddSystem.addUser("홍길동","a@naver.con");
userMapAddSystem.addUser("이순신","b@naver.con");
userMapAddSystem.printAllUser();
}
}//end of class
class User {
String name;
String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
'JAVA 유용한 클래스' 카테고리의 다른 글
(JAVA)래퍼 클래스(Wrapper Class) - 10 (0) | 2025.05.12 |
---|---|
(JAVA)제네릭(Generic) -9 (0) | 2025.05.08 |
(JAVA)inner class (중첩 클래스) - 7 (0) | 2025.04.25 |
(JAVA)자바 multi-threading 이란 - 6 (0) | 2025.04.25 |
(JAVA)자바 Thread - 5 (0) | 2025.04.25 |