List(ArrayList, Vector, LinkedList)

hovi·2023년 5월 30일
0

JAVA

목록 보기
24/36

List 인터페이스란?

리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있습니다.

리스트와 배열의 가장 큰 차이점은 크기가 정해져 있지 않고 동적으로 변한다는 점 입니다.

데이터를 크기를 알 수 없을 때 유용하게 사용할 수 있습니다.

  • 요소의 저장 순서가 유지 됩니다.
  • 같은 요소의 중복 저장을 허용 합니다.
  • 데이터 크기가 고정되어 있지 않습니다. (동적 할당)
  • 데이터를 다루기 위한 여러 방법이 제공됨

자바4 이전 표시 방법

  • 리스트 생성 시 컴파일 타임에 객체의 타입을 확인하지 않습니다.
List list new ArrayList();
list.add("우영우");
Object obj = list.get(0);
String name = (String) obj;

자바5 이후 표시 방법

list<String> list = new ArrayList<String>();
list.add("우영우");
String name = list.get(0);

List 컬렉션 클래스의 종류

  • ArrayList (가장 많이 사용 됩니다.)
  • LinkedList
  • Vector
  • Stack

ArrayList 클래스

개체의 배열을 구현한 클래스이며 컬렉션 인터페이스와 그 하위의 List 인터페이스로 구현 합니다.

객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램을 구현 할 때 사용 합니다.

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
				System.out.println(pitches);
    }
}

제네릭스 : 자바는 J2SE 5.0 버전 이후부터 ArrayList<String> pitches = new ArrayList<>();
처럼 객체를 포함하는 자료형도 어떤 객체를 포함하는지에 대해서 명확하게 표현할 것을 권고하고 있다.

특정 위치에 삽입

해당 컬렉션에 요소를 추가 하거나 해당 인덱스 위치에 값을 삽입

pitches.add(0, "130");

get

특정 위치의 값을 가져 올 때

System.out.println(pitches.get(1));

size

ArrayList의 갯수를 리턴한다.

System.out.println(pitches.size());

contains

리스트 안에 해당 항목이 있는지를 판별하여 그 결과를 boolean으로 리턴한다.

System.out.println(pitches.contains("142"));

remove

remove(객체) : 리스트에서 객체에 해당되는 항목을 삭제하고 삭제한 결과(true, false)를 리턴

System.out.println(pitches.remove("129"));
true

remove(인덱스) : 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴

System.out.println(pitches.remove(0));

다양한 방법으로 ArrayList 만들기

public static void main(String[] args) {
    ArrayList<String> pitches = new ArrayList();
    pitches.add("138");
    pitches.add("129");
    pitches.add("142");
    System.out.println(pitches);
    String one = pitches.get(0);  // 형 변환이 필요없다.
    String two = pitches.get(1);  // 형 변환이 필요없다.

    System.out.printf("%s %s\n", one, two);
}

이미 데이터가 존재할 경우 데이터 추가 하기

public static void main(String[] args) {
    String[] data = {"138", "129", "142"};
    ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data));
    System.out.println(pitches);
}

String.join

콤마로 구분하여 문자열 만들기

public static void main(String[] args) {
    String[] data = {"138", "129", "142"};
    ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data));
    String result = String.join(",", pitches);
    System.out.println(result);
}

리스트 정렬하기

  • 오름차순 정렬 : Comparator.naturalOrder()
  • 내림차순 정렬 : Comparator.reverseOrder()
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class List {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        pitches.sort(Comparator.naturalOrder());  // 오름차순으로 정렬
        System.out.println(pitches);  // [129, 138, 142] 출력
    }
}

클래스를 ArrayList로 구성

class MenuInfo {
    String name = "";
    int price;
    String category = "";
    String desc = "";
    boolean isTax;
    MenuInfo(String name, int price, boolean isTax) {
        this.name = name;
        this.price = price;
        this.isTax = isTax;
    }
    public String getJsonFormat() {
        return "{"+"\"name\":"+name+","+"\"price\":"+price+","+"\"isTax\":"+isTax+"}";
    }
}

public class List {
    public static void main(String[] args) {
        ArrayList<MenuInfo> menuList = new ArrayList<>();
        menuList.add(new MenuInfo("Americano", 2000, true));
        menuList.add(new MenuInfo("Latte", 4000, true));
        menuList.add(new MenuInfo("Espresso", 2500, true));

        for(int i = 0; i < menuList.size(); i++) {
            System.out.println(menuList.get(i).getJsonFormat());
        }
    }
}

홀수, 짝수 나눠 담기

package 어레이홀짝;
public class ArrayListEx1 {
    public static void main(String[] args) {
        ArrayMethod arrayMethod = new ArrayMethod();
        arrayMethod.inputValue();
        arrayMethod.calcMethod();
        arrayMethod.printMethod();
    }
}

package 어레이홀짝;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ArrayMethod {
    List<Integer> inList = new ArrayList<>();
    List<Integer> oddList = new ArrayList<>();
    List<Integer> evenList = new ArrayList<>();
    // 정수값 입력 받는 메소드
    void inputValue() {
        int tmp = 0;
        Scanner sc = new Scanner(System.in);
        System.out.print("정수 입력 : ");
        while(true) {
            tmp = sc.nextInt();
            if(tmp == 999) break;
            inList.add(tmp);
        }
    }
    void calcMethod() {
        for(Integer e : inList) {
            if(e % 2 == 0) evenList.add(e);
            else oddList.add(e);
        }
    }
    void printMethod() {
        System.out.print("홀수 : ");
        for(Integer e : oddList) System.out.print(e + " ");
        System.out.println();
        System.out.print("짝수 : ");
        for(Integer e : evenList) System.out.print(e + " ");
        System.out.println();
    }

}

LinkedList 클래스

사용 방법은 ArrayList와 동일 합니다.

LinkedList 클래스는 ArrayList 클래스가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위해 고안되었습니다.

JDK 1.2부터 제공된 LinkedList 클래스는 내부적으로 연결 리스트(linked list)를 이용하여 요소를 저장합니다.

배열은 저장된 요소가 순차적으로 저장됩니다.

하지만 연결 리스트는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크(link)로 연결하여 구성합니다.

다음 요소를 가리키는 참조만을 가지는 연결 리스트를 단일 연결 리스트(singly linked list)라고 합니다.

Vector 클래스

Vector는 ArrayList와 동일한 내부 구조를 가지고 있습니다. (사용 방법 동일)

**List<E> list = new Vector<E>();**

ArrayList와 다른점은 동기화된(synchronized) 메소드로 구성되어 있어 멀티 쓰레드 환경에서 안전하지만 ArrayList에 비해 성능은 떨어 집니다.

package 벡터연습;
import java.util.List;
import java.util.Vector;

public class VectorMain {
    public static void main(String[] args) {
        List<NameCard> list = new Vector<>();
        list.add(new NameCard("우영우", "yyy@gmail.com", "010-1234-5678", "변호사"));
        list.add(new NameCard("동그라마", "ddd@gmail.com", "010-1234-5678", "무직"));
        list.add(new NameCard("이준호", "ljh@gmail.com", "010-1234-5678", "회사원"));

        for(NameCard e : list) {
            System.out.println("이름 : " + e.name);
            System.out.println("메일 : " + e.mail);
            System.out.println("전화 : " + e.phone);
            System.out.println("직업 : " + e.jobs);
        }
    }
}

class NameCard {
    String name;
    String mail;
    String phone;
    String jobs;

    public NameCard(String name, String mail, String phone, String task) {
        this.name = name;
        this.mail = mail;
        this.phone = phone;
        this.jobs = task;
    }
}
profile
풀스택 예비 개발자

0개의 댓글