JAVA 유용한 클래스

(JAVA)컬렉션 프레임워크(collection framework)란? - 8

mynote6676 2025. 5. 7. 17:40

자바에서 컬렉션 프레임워크(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 + '\'' +
                '}';
    }
}

 

 

 

 

 

728x90