본문 바로가기
개발/Java

[Java] List 컬렉션

by 두리두리안 2021. 5. 22.

List컬랙션이란

List컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다. 

객체를 인덱스로 관리하기 때문에 객체를 저장하면 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색를 검색, 삭제할 수 있는 기능을 제공

 

List컬렉션은 객체 자체를 저장하는것이 아니라 다음 그림과 같이 객체의 번지를 참고 한다. 

동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지를 참조, null도 저장이 가능하면 이 경우 해당 인덱스는 객체를 참조하지 않는다. 

List 컬렉션

ArrayList이란

arrayList는 List 인터페이스의 구현 클래스로, ArrayList에 객체를 추가하면 객체가 인덱스로 관리된다. 

일반 배열과 ArrayList는 인덱스로 객체를 관리하는다는 점에서 유사하지만,

큰차이는 배열은 생성할 때 크기가 고정되고 사영 중에 크기를 변경할 수 없지만, ArrayList는 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이  늘어난다. 

 

List<String> list = new ArrayList<String>();

List<String> list = new ArrayList<String>(30); 
//30은 String 객체 30개를 저장할수 있는 용량을 가진다. 

 

ArrayListExample.java

package ListMap;

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args){
        List<String> list = new ArrayList<String>();

        list.add("java");
        list.add("JDBC");
        list.add("Servlet/JSP");
        list.add(2, "Database");
        list.add("iBATIS");

        int size = list.size(); // 저장된 총 객체 수 얻기
        System.out.println("총 객체수 : "+size);
        System.out.println("***************************");

        String skill = list.get(2);// 2번 인덱스의 객체 얻기
        System.out.println("2 : " +skill);
        System.out.println("***************************");

        for(int i=0; i<list.size(); i++){
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }
        System.out.println("***************************");

        list.remove(2); // 2번 인덱스 객체 삭제(Database 삭제)
        list.remove(2); // 2번 인덱스 객체 삭제(Servlet/JSP 삭제)
        list.remove("iBATIS"); // 2번 인덱스 객체 삭제
        for(int i =0; i<list.size(); i++){
            String str = list.get(i);
            System.out.println(i + ":" + str);
        }

    }
}


ArrayList를 생성하고 런타임 시 필요에 의해 객체들을 추가하는 것이 일반적이지만,

고정된 객체들로 구성된 List를 생성할 때도 있다. 이런 경우에는 Arrays.asList(T... a)메소드를 사용하는 것이 간편하다.

 

 List<T> list = Arrays.asList(T... a);

 

T타입 파라미터에 맞게 asList()의 매개값을 순차적으로 입력하거나, T[]배열을 매개값으로 주면된다. 

 

고정된 String 객체를 요소로 갖는 ArrrayList객체를 생성하는 예제 

 

package ListMap;

import java.util.Arrays;
import java.util.List;

public class ArraysAsListExample {
    public static  void main(String[] args){
        List<String> list1 = Arrays.asList("홍길동", "신용권", "감자바");
        System.out.println("*********************************");
        System.out.println("ArrayList String형");
        System.out.println("*********************************");
        for(String name : list1){
            System.out.println("list1 >" +name);
        }
        System.out.println("*********************************");
        System.out.println("ArrayList Integer형");
        System.out.println("*********************************");

        List<Integer> list2 = Arrays.asList(1,2,3);
        for(int value : list2){
            System.out.println("list2 >" +value);
        }
        System.out.println("*********************************");
    }
}


Vector이란

Vector는 ArrayList와 동일한 내부 구조를 가지고 있다. Vector를 생성하기 위해서는 저장할 객체타입을 타입 파리미터로 표기하고 기본 생성자를 호출하면 된다.

 

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

ArrayList와 다른 점은 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료하야만 다른 스레드를 실행할 수 있다. 

 

멀티 스레드 환경에서 완전하게 객체를 추가, 삭제할 수 있다. 

 

package ListMap;

public class Board {
    String subject;
    String content;
    String writer;

    public Board(String subject, String content, String writer){
        this.subject = subject;
        this.content = content;
        this.writer = writer;
    }
}

 

package ListMap;

import java.util.List;
import java.util.Vector;

public class VectorExample {
    public  static  void main(String[] args){
        List<Board> list = new Vector<Board>();

        list.add(new Board("제목1", "내용1", "글쓴이1"));
        list.add(new Board("제목2", "내용2", "글쓴이2"));
        list.add(new Board("제목3", "내용3", "글쓴이3"));
        list.add(new Board("제목4", "내용4", "글쓴이4"));
        list.add(new Board("제목5", "내용5", "글쓴이5"));

        list.remove(2);
        list.remove(3);

        for(int i=0; i<list.size(); i++){
            Board board = list.get(i);
            System.out.println(board.subject +"\t"+board.content+"\t"+board.writer );
        }
    }
}

 


LinkedList이란

LinkedList는 list 구현 클래스이므로 ArrayList와 사용 방법은 똑같지만 내부 구조는 완전 다르다.

ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리

 

LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 

특정 인덱스에 객체를 삽입할 때에도 마찬가지다. ArrayList는 중간 인덱스의 객체를 제거하면 뒤의 객체는 인덱스가 1씩 앞으로 당겨진다고 했다. 

 

그렇기 때문에 비번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList가 좋은 성능을 발휘한다. 

LinkedList가 처음 생성될 때에는 어떠한 링크도 만들어지지 않기 때문에 내부는 비어 있다고 보면 된다. 

 

List<E> list = new LinkedList<E>();

 

package ListMap;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args){
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new LinkedList<String>();

        long startTime;
        long endTime;

        startTime = System.nanoTime();
        for(int i=0; i<10000; i++){
            list1.add(0, String.valueOf(i));
        }
        endTime =System.nanoTime();
        System.out.println("ArrayList 걸리는 시간 : " + (endTime-startTime) + "ns");
        startTime = System.nanoTime();
        for(int i=0; i<10000; i++){
            list2.add(0, String.valueOf(i));
        }
        endTime = System.nanoTime();
        System.out.println("ListedList 걸린시간 : " +(endTime-startTime) + "ns");
    }
}

 

 

'개발 > Java' 카테고리의 다른 글

Hashtable 이론정리  (0) 2021.05.26
[Map] HashMap 이론 및 코드  (0) 2021.05.26
[Java] HashMap  (0) 2021.05.22
[Java] Method(4) - 외부 호출  (0) 2021.05.19
[Java] Method(3) - 메소드 호출  (0) 2021.05.19