100세까지 코딩

[자바 공부] 컬렉션(3) List 본문

JAVA

[자바 공부] 컬렉션(3) List

100세까지 코딩 2023. 9. 14. 19:37
List란?
  • 요소들에 순서를 부여하며 저장한다.
  • 인덱스가 있어 위치를 지정하여 찾을 수 있다.
  • 동일한 요소를 중복 저장할 수 있다.
List 종류
ArrayList 동적 배열을 이용한 List
Vector ArrayList와 거의 동일, but 동기화 제공
LinkedList 연결 리스트로 구현된 List
ArrayList
  • 배열을 이용하여 List 인터페이스를 구현한 클래스이다.
  • List 종류 중 가장 많이 사용되는 클래스이다.
  • ArrayList는 필요한 경우 현재의 크기보다 50% 자동으로 크기를 키운다. 
    그러나, 비용이 비싸서 생성자를 사용하여 목적에 맞게 사이즈를 설정하는 것이 좋다.
  • 요소들은 get(), set()으로 직접 접근 가능하다.
  • add(), remove()를 사용하여 새로운 요소를 추가 또는 제거할 수 있다.
ArrayList 예시
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class ArrayListStudy {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>(5); // 목적에 맞게 사이즈 설정
        list.add("111"); // [0]인덱스에 "111" 추가
        list.add("222"); // [1]인덱스에 "222" 추가
        list.add(1, "333"); // [1] 인덱스에 "333" 추가 후 기존에 있던것은 한칸 뒤로
        list.add("444");

        System.out.println("구성 데이터 : " + list);

        // 데이터 위치 파악
        int pos = list.indexOf("222");
        System.out.println("222의 위치는 :" + pos);

        // ArrayList가 비어 있는지, 데이터 포함 여부 검사
        boolean check1 = list.isEmpty();
        boolean check2 = list.contains("444");

        System.out.println("비어 있음 : " + check1 + " 포함 여부 : " + check2);

        // 데이터 개수
        int size = list.size();
        System.out.println("리스트의 크기 :" + size);

        // 특정 위치 데이터 구하기
        String item = list.get(2);
        System.out.println("2번째 위치 데이터 : " + item);

        // 데이터 반복 처리 - 첫 번째 방법
        System.out.println("데이터 반복 처리 - 첫 번째 방법");

        for (int i = 0; i < list.size(); i++){
            System.out.println("Index: " + i + " - Item: " + list.get(i));
        }

        // 데이터 반복 처리 - 두 번째 방법
        System.out.println("데이터 반복 처리 - 두 번째 방법");

        for (String str : list){
            System.out.println("Item is: " + str);
        }

        // 데이터 반복 처리 - 세 번째 방법
        System.out.println("데이터 반복 처리 - 세 번째 방법");
        for (Iterator<String> it = list.iterator(); it.hasNext();) {
            System.out.println("데이터 :" + it.next());
        }

        // 데이터 수정
        list.set(1,"888");
        System.out.println("수정 후 :" + list);

        // 지정 위치 데이터 제거, 데이터로 저장되어 있는 첫 요소 제거
        list.remove(0);
        list.remove("444");
        System.out.println("리스트의 최종 내용 : " + list);

        // Arraylist를 Array로 변환
        String[] arr = list.toArray(new String[list.size()]);
        System.out.println("변환 배열 : " + Arrays.toString(arr));
    }
}

결과 : 

자바만 잡아도 - 김병만 참조 코드


Vector
  • ArrayList와 동일하지만 차이점은 2개다.
  • 첫 째, 동기화 기능이 있다.
  • 둘 째, 사이즈를 증가시킬 때 100% 증가시킨다.
  • 멀티 스레드가 아닌 경우에는 동기화되어 있지 않은 ArrayList를 사용하는 게 바람직하다. (성능 ↑)
Vector 예시

- ArrayList와 사용법이 비슷하기 때문에 Vector에서만 사용할 수 있는 요소 추가와 반복 처리 방법을 알아보기

import java.util.Enumeration;
import java.util.Vector;

public class VectorStudy {
    public static void main(String[] args) {
        Vector<String> v = new Vector<String>();
        v.add("aaa");  // "aaa" 추가, Collection 메서드
        v.addElement("bbb"); // "bbb" 추가, Vector 메서드
        v.addElement("ccc"); 
        v.remove("bbb"); 

        // Vector에서만 적용할 수 있는 반복 처리 방법
        Enumeration<String> e = v.elements();
        while(e.hasMoreElements()) {
            System.out.println(e.nextElement());
        }
    }
}

결과 :


LinkedList
  • 연결 리스트 형태로 자료를 저장한다.
  • 데이터가 많으면 검색 시 처음부터 순차적으로 찾아야 되어 성능이 저하된다.
  • 데이터 추가 / 삭제는 위치 정보를 수정만 하면 되어 처리가 빠르다.
  • LinkedList는 자료구조가 유연성이 있어 Stack, Queue 둘다 구현 가능하다.
메서드 예시
import java.util.LinkedList;

public class LinkedListStudy {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();

        list.addFirst("aaa"); // 리스트 제일 앞에 추가
        list.addLast("bbb"); // 리스트 끝에 추가
        list.getLast(); // 마지막 위치 데이터 반환

        // Queue 관련
        list.offer("ddd"); // 마지막 원소로 추가
        list.poll(); // 리스트의 첫 번째 데이터 반환 (제거 O)
        list.peek(); // 리스트의 첫 번째 데이터 반환 (제거 X)

        // Stack 관련
        list.push("eee"); // 리스트의 마지막에 추가
        list.pop(); // 리스트의 마지막 데이터 반환 (제거 O)
        list.peek(); // 리스트의 마지막 데이터 반환 (제거 X)

        // 임의의 위치 데이터 조작
        list.add("111");
        list.add(1,"222"); // [1] 인덱스에 "222" 추가
        list.get(1); // [1] 인덱스 데이터 반환
        list.remove(1); // [1] 인덱스 원소 삭제
    }
}
LinkedList 예시
import java.util.LinkedList;

public class LinkedListStudy {
    public static void main(String[] args) {

        // Stack 관련
        LinkedList<String> stack = new LinkedList<>();
        stack.push("aaa");
        stack.push("bbb");
        System.out.println("Stack :" + stack);
        String s = stack.pop();
        System.out.println(s+"가 팝업됨");
        System.out.println("Stack :" + stack);

        // Queue 관련
        LinkedList<String> queue = new LinkedList<>();
        queue.offer("ccc");
        queue.offer("ddd");
        System.out.println("Queue :" + queue);
        String ss = queue.poll();
        System.out.println(ss + "가 반환 및 제거");
        System.out.println("Queue :" + queue);
		
         // 임의 위치의 데이터 조작
        LinkedList<String> list = new LinkedList<String>();
        list.add("aaa");
        list.add("fff");
        list.add(0,"ggg");
        System.out.println("List : " + list);
        String sss = list.remove(1);
        System.out.println(sss+"가 제거됨");
        String t = list.get(1);
        System.out.println("인덱스 1 위치의 값은 : " + t);
        System.out.println("List : " + list);
    }
}

결과 :

자바만 잡아도 - 김병만 참조 코드

 

컬렉션의 입문 시작 !!

'JAVA' 카테고리의 다른 글

[자바 공부] 컬렉션(5) Map  (0) 2023.09.15
[자바 공부] 컬렉션(4) Stack & Queue  (0) 2023.09.15
[자바 공부] 컬렉션(2) Set  (0) 2023.09.12
[자바 공부] 컬렉션(1) Iterator  (0) 2023.09.12
[자바 공부] 제네릭  (0) 2023.09.10