Programming/Java

[Java] 자바 Vector 사용 방법

psychoria 2021. 4. 6. 00:00
반응형

Vector는 ArrayList와 LinkedList와 같이 리스트를 구체화한 클래스입니다.

ArrayList와 LinkedList에 대한 내용은 아래 링크에서 확인 가능합니다.

2020.11.11 - [Programming/Java] - [Java] 자바 ArrayList 사용 방법

2020.11.28 - [Programming/Java] - [Java] 자바 LinkedList 사용 방법

Vector는 컬렉션 프레임워크(Collection Framework)가 존재하기 전에 추가된 레거시 클래스 중 하나입니다.

현재는 제너릭 등을 지원할 수 있도록 재설계되어 있습니다.

내부에 배열을 가지고 있으며 순서대로 값들이 저장됩니다.

Vector

Vector와 ArrayList는 거의 유사한 형태의 클래스로 크기가 가변적으로 변합니다.

다만 Vector와 ArrayList는 몇 가지 차이점이 존재합니다.

Vector는 동기화를 제공하기 때문에 멀티 스레드 환경에서 안전(Thread Safe)합니다.

동기화로 인해 일반적으로 Vector는 ArrayList보다 낮은 성능을 보입니다.

그렇기 때문에 동기화가 필요하지 않을 때는 ArrayList를 사용하는 것을 더 추천합니다.

자바의 Vector를 활용하는 방법을 알아보겠습니다.

 

1. Vector 생성

자바의 Vector를 사용하기 위해 아래 구문을 추가합니다.

import java.util.Vector;

아래 방법 중 하나를 선택해서 Vector를 초기화할 수 있습니다.

Vector<Integer> vector1 = new Vector<Integer>(); // 타입 지정
Vector<Integer> vector2 = new Vector<>(); // 타입 생략 가능
Vector<Integer> vector3 = new Vector<>(10); // 초기 용량(Capacity) 설정
Vector<Integer> vector4 = new Vector<>(10, 10); // 초기 용량, 증가량 설정
Vector<Integer> vector5 = new Vector<>(vector1); // 다른 Collection값으로 초기화
Vector<Integer> vector6 = new Vector<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()

일반적으로 타입을 생략해서 초기화하는 두 번째 방법을 사용합니다.

그리고 Vector는 크기를 늘려야 할 때 현재 크기의 2배만큼 증가시킵니다.

이 증가 값을 생성자에서 설정하는 것도 가능합니다.

 

2. Vector 엘레멘트 추가/변경

Vector 역시 add() 메소드로 엘레멘트를 추가할 수 있습니다.

set() 메소드는 기존에 추가된 값을 변경하는 데 사용됩니다.

import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector<String> colors = new Vector<>();
        // add() method
        colors.add("Black");
        colors.add("White");
        colors.add(0, "Green");
        colors.add("Red");

        // set() method
        colors.set(0, "Blue");

        System.out.println(colors);
    }
}

인덱스를 별도로 지정하지 않으면 리스트의 끝에 값을 추가합니다.

인덱스를 지정하면 해당 위치에 추가되고 해당 인덱스부터의 엘레멘트들이 뒤로 한 칸씩 밀립니다.

결과

처음에 Black, White가 순서대로 추가됩니다.

다음으로 Green이 가장 앞에 추가되기 때문에 Black과 White가 뒤로 밀리게 됩니다.

set()으로는 가장 처음의 Green을 Blue를 변경했기 때문에 위와 같이 결과가 출력됩니다.

 

3. Vector 엘레멘트 삭제

값을 삭제할 때는 remove() 메소드를 호출하고 모든 값을 삭제하려면 clear()를 호출하면 됩니다.

import java.util.Arrays;
import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector<String> colors = new Vector<>(Arrays.asList("Black", "White", "Green", "Red"));
        String removedColor = colors.remove(0);
        System.out.println("Removed color is " + removedColor);

        colors.remove("White");
        System.out.println(colors);

        colors.clear();
        System.out.println(colors);
    }
}

remove()는 인덱스나 실제 값을 입력 값으로 받습니다.

인덱스를 입력해서 삭제하는 경우 삭제된 값을 리턴으로 받을 수 있습니다.

내용을 전체 삭제하고 싶은 경우 clear()를 호출하면 됩니다.

결과

결과 화면을 확인하면 동작을 쉽게 이해할 수 있습니다.

 

4. Vector 전체 값 확인

다양한 방법으로 Vector 안의 모든 값을 순회할 수 있습니다.

import java.util.Arrays;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector<String> colors = new Vector<>(Arrays.asList("Black", "White", "Green", "Red"));
        // for-each loop
        for (String color : colors) {
            System.out.print(color + "  ");
        }
        System.out.println();

        // for loop
        for (int i = 0; i < colors.size(); ++i) {
            System.out.print(colors.get(i) + "  ");
        }
        System.out.println();

        // using iterator
        Iterator<String> iterator = colors.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "  ");
        }
        System.out.println();

        // using listIterator
        ListIterator<String> listIterator = colors.listIterator(colors.size());
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + "  ");
        }
        System.out.println();
    }
}

ArrayList와 동일한 방법으로 for-each, for, iterator, listIterator 등을 사용할 수 있습니다.

listIterator를 사용하면 역방향 순회 역시 가능합니다.

출력 결과

자바 8에서 컬렉션에 추가된 forEach() 메소드를 통해 값들을 접근하는 것도 가능합니다.

colors.forEach(color -> System.out.print(color + "  "));

여러 방법 중 편리한 방법을 선택해서 사용하면 됩니다.

 

5. 값 존재 유무 확인

다른 리스트 클래스와 마찬가지로 contains()와 indexOf()를 호출해서 특정 값이 존재하는지 확인 가능합니다.

contains()는 값이 존재하는지 여부를 boolean 타입으로 리턴합니다.

indexOf()는 존재할 경우 인덱스를 리턴하고 존재하지 않으면 -1을 리턴합니다.

import java.util.Arrays;
import java.util.Vector;

public class Main {
    public static void main(String[] args) {
        Vector<String> colors = new Vector<>(Arrays.asList("Black", "White", "Green", "Red"));
        boolean contains = colors.contains("Black");
        System.out.println(contains);

        int index = colors.indexOf("Blue");
        System.out.println(index);

        index = colors.indexOf("Red");
        System.out.println(index);
    }
}

Vector 역시 자바 List를 구현하고 있기 때문에 ArrayList나 LinkedList와 동일하게 사용할 수 있습니다.

Vector 클래스는 동기화가 필요할 때 고려하며 그 외에는 ArrayList를 더 선호해서 사용합니다.

리스트는 자주 사용되기 때문에 상황에 맞춰서 선택하는 것을 추천합니다.

반응형