본문 바로가기

라이브러리 활용 - 컬렉션 자료구조

List 컬렉션

List 컬렉션

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


    출처, 이것이 자바다


ArrayList

  • ArrayList에 객체를 추가하면 내부 배열에 객체가 저장되고 제한 없이 객체를 추가할 수 있음


    출처, 이것이 자바다


  • 객체의 번지를 저장. 동일한 객체를 중복 저장 시 동일한 번지가 저장. null 저장 가능


    출처, 이것이 자바다


  • ArrayList 컬렉션에 객체를 추가 시 인덱스 0번부터 차례대로 저장
  • 특정 인덱스의 객체를 제거하거나 삽입하면 전체가 앞/뒤로 1씩 당겨지거나 밀림
  • 빈번한 객체 삭제와 삽입이 일어나는 곳에선 바람직하지 않음


    출처, 이것이 자바다


package ch15.sec02.exam01;

import java.util.ArrayList;

/*
 컬렉션 기억장소
 - 특징? 데이터 추가시 기억장소를 동적으로 생성한다.
           모든 데이터(타입)을 저장가능 -> 제네릭타입(타입을 지정)
           자료구조의 특징을 가지고 있음
           객체저장목적
 */

public class CollectionBasic {

    public static void main(String[] args) {

        //배열과 컬렉션 비교.
        //1)배열 : 크기가 고정. 동일한 타입만 저장가능.
        int[] arr = new int[3];
        arr[0] = 10;
        arr[1] = 20;
        arr[2] = 30;

//        arr[3] = 40; //배열선언시 크기가 고정되어 있으므로, 기억장소를 추가 해서 사용할수가 없다.

        //컬렉션 ArrayList클래스? 컬렉션 형태의 기억장소를 생성
        ArrayList al = new ArrayList(); //힙영역의 기억장소 타입 Object
//        al.add(1); //컬렉션 기억장소에 데이터를 추가저장.
//        al.add("홍길동");
//        al.add(10.5);
//        al.add(true);

        //int형 데이터만 저장
        al.add(10);
        al.add(20);
        al.add(30);

        ArrayList<Integer> al2 = new ArrayList<Integer>(); //힙영역의 기억장소 타입 Integer
        al2.add(10);
        al2.add(20);
        al2.add(30);

        ArrayList<Double> al3 = new ArrayList<Double>();
        al3.add(10.5);
    }
}

package ch15.sec02.exam01;


//게시판클래스


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

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

    public String getSubject() { return subject; }
    public void setSubject(String subject) { this.subject = subject;}

    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }

    public String getWriter() { return writer; }
    public void setWriter(String writer) { this.writer = writer; }
}

package ch15.sec02.exam01;

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

/*
 List인터페이스 : 순서유지(인덱스형태), 중복 저장 가능
  - ArrayList클래스
 */

public class ArrayListExample {

    public static void main(String[] args) {

        //부모인터페이스 변수 = 구현객체;
        List<Board> list = new ArrayList<Board>();

        //객체추가
        list.add(new Board("제목1", "내용1", "글쓴이1")); //인덱스 0
        list.add(new Board("제목2", "내용2", "글쓴이2")); //인덱스 1
        list.add(new Board("제목3", "내용3", "글쓴이3")); //인덱스 2
        list.add(new Board("제목4", "내용4", "글쓴이4")); //인덱스 3
        list.add(new Board("제목5", "내용5", "글쓴이5")); //인덱스 4

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

        //인덱스를 통하여 특정 객체 참조하기
        Board board = list.get(2); //Board board = new Board("제목3", "내용3", "글쓴이3")
        System.out.println(board.getSubject() + "\t" + board.getContent() + 
                "\t" + board.getWriter());

        board = list.get(4);
        System.out.println(board.getSubject() + "\t" + board.getContent() + 
                "\t" + board.getWriter());

        System.out.println();

        //모든 객체를 하나씩 가져오기    i=0, 1, 2, 3, 4
        for(int i=0; i<list.size(); i++) {
            Board b = list.get(i);
            System.out.println(b.getSubject() + "\t" + b.getContent() + "\t" + b.getWriter());
        }
        System.out.println();

        //객체 삭제
        list.remove(2); //3번째 객체삭제. new Board("제목3", "내용3", "글쓴이3")
        list.remove(2); //3번째 객체삭제. new Board("제목4", "내용4", "글쓴이4")

        //향상된 for문
        for(Board b : list) {
            System.out.println(b.getSubject() + "\t" + b.getContent() + "\t" + b.getWriter());
        }        
    }
}

package ch15.sec02.exam01;

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

/*
 List인터페이스 : 순서유지(인덱스형태), 중복 저장 가능
  - ArrayList클래스
 */

public class ArrayListExample2 {

    public static void main(String[] args) {

        //부모인터페이스 변수 = 구현객체;
        List<Board> list = new ArrayList<Board>();

        Board brd = new Board("제목1", "내용1", "글쓴이1");

        //객체추가. 중복저장 가능.
        list.add(brd); //인덱스 0 
        list.add(brd); //인덱스 1
        list.add(new Board("제목3", "내용3", "글쓴이3")); //인덱스 2
        list.add(new Board("제목4", "내용4", "글쓴이4")); //인덱스 3
        list.add(new Board("제목5", "내용5", "글쓴이5")); //인덱스 4

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

        //인덱스를 통하여 특정 객체 참조하기
        Board board = list.get(2); //Board board = new Board("제목3", "내용3", "글쓴이3")
        System.out.println(board.getSubject() + "\t" + board.getContent() + 
                "\t" + board.getWriter());

        board = list.get(4);
        System.out.println(board.getSubject() + "\t" + board.getContent() + 
                "\t" + board.getWriter());

        System.out.println();

        //모든 객체를 하나씩 가져오기    i=0, 1, 2, 3, 4
        for(int i=0; i<list.size(); i++) {
            Board b = list.get(i);
            System.out.println(b.getSubject() + "\t" + b.getContent() + "\t" + b.getWriter());
        }
        System.out.println();

        //객체 삭제
        list.remove(2); //3번째 객체삭제. new Board("제목3", "내용3", "글쓴이3")
        list.remove(2); //3번째 객체삭제. new Board("제목4", "내용4", "글쓴이4")

        //향상된 for문
        for(Board b : list) {
            System.out.println(b.getSubject() + "\t" + b.getContent() + "\t" + b.getWriter());
        }        
    }
}

Vector

  • 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없음
  • 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있음


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch15.sec02.exam02;


//게시판클래스


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

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

    public String getSubject() { return subject; }
    public void setSubject(String subject) { this.subject = subject;}

    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }

    public String getWriter() { return writer; }
    public void setWriter(String writer) { this.writer = writer; }    
}

package ch15.sec02.exam02;

/*
List인터페이스 : 순서유지(인덱스형태), 중복 저장 가능
 - Vector클래스 : 스레드 사용
*/

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")); //인덱스3
        list.add(new Board("제목5", "내용5", "글쓴이5"));

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

            //인덱스3 삽입
            list.add(3, new Board("객체3_2", "내용3_2", "글쓴이3_2"));

            System.out.println();

            for(Board b : list) {
                System.out.println(b.getSubject() + "\t" + b.getContent() + 
                    "\t" + b.getWriter());
            }        
    }
}

LinkedList

  • 인접 객체를 체인처럼 연결해서 관리. 객체 삭제와 삽입이 빈번한 곳에서 ArrayList보다 유리


    출처, 이것이 자바다



    출처, 이것이 자바다



    출처, 이것이 자바다


package ch15.sec02.exam03;

/*
 * ArrayList 와 LinkedList 클래스의 성능비교.
 */

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(); //1970년 1월1일 0시부터
        for(int i=0; i<10000; i++) {
            list1.add(0, String.valueOf(i)); //첫번째 요소에 삽입하여, 기존것은 인덱스가 1씩 변경이 발생한다.
        }
        endTime = System.nanoTime();
        System.out.printf("%-17s %8d ns \n", "ArrayList 걸린 시간: ", (endTime-startTime)); // %-17s %8d ns \n  -> s : String, - : 왼쪽정렬

        startTime = System.nanoTime(); //1970년 1월1일 0시부터
        for(int i=0; i<10000; i++) {
            list2.add(0, String.valueOf(i)); //첫번째 요소에 삽입하여, 기존것은 인덱스가 1씩 변경이 발생한다.
        }
        endTime = System.nanoTime();
        System.out.printf("%-17s %8d ns \n", "LinkedList 걸린 시간: ", (endTime-startTime)); // %-17s %8d ns \n  -> s : String, - : 왼쪽정렬
    }    
}

'라이브러리 활용 - 컬렉션 자료구조' 카테고리의 다른 글

LIFO와 FIFO 컬렉션  (0) 2023.02.01
검색 기능을 강화시킨 컬렉션  (0) 2023.02.01
Map 컬렉션  (0) 2023.02.01
Set 컬렉션  (0) 2023.02.01
컬렉션 프레임워크  (0) 2023.01.31