Java Vector

2SEONGA·2025년 4월 24일
0

Java

목록 보기
13/13
post-thumbnail

바야흐로 Java 1.0 시절부터 이어져온 Vector 에 대해 알아보자.

Vector = 동기화된 ArrayList

Java 1.0 부터 존재하던 Vector는 동적 배열(Dynamic Array)을 구현한 클래스
내부적으로는 배열처럼 동작하지만 크기가 자동으로 조절된다는 장점 존재

import java.util.Vector;

Vector<String> list = new Vector<>();
list.add("apple");
list.add("banana");

특징

  • 동적 크기
    배열과 달리 요소를 추가하면 크기가 자동으로 증가
  • 동기화(Synchronized)
    스레드 안전(Thread Safety)하게 동작하여 멀티스레드 환경에서 유리
  • 성능
    단일 스레드 환경에서도 동기화 처리를 하기 때문에 ArrayList 보다 느릴 수 있다는 단점 존재

근데 난.. 처음 듣는 걸?

주로 C++에서 사용하며 Java에서는 자주 쓰이진 않는다. 왜일까?

Vector Vs. ArrayList

항목VectorArrayList
동기화O (Thread Safety)X (Non Thread Safety)
성능상대적으로 느림빠름 (싱글 스레드 환경에서 추천)
사용 시기멀티 스레드 환경에서 필요할 때대부분의 일반적인 상황

요즘엔 ArrayList를 쓰고, 필요한 경우 Collections.synchronizedList()로 감싸는 걸 더 권장

Vector Vs. LinkedList

항목VectorLinkedList
내부 구조배열 기반노드 기반
접근 속도빠름 (인덱스 접근 O(1))느림 (인덱스 접근 O(n))
삽입/삭제느림 (중간 요소 이동 필요)빠름 (앞뒤 포인터만 수정)
동기화OX (직접 동기화 필요)


Vector 를 어디서 보게됐냐면..

좌표와 관련된 문제를 풀던 중, Vector 를 사용한 것을 보았고
Vector 에 대해 자세히 알아보는 계기가 되었다.

Vector 가 사용되었던 문제 재구성

입력 예시

  • 격자 크기: 3 → 즉, 3x3 2차원 배열
  • 이동 횟수: 4
  • 방향과 거리: 예를 들어 S 2, N 1, E 1, W 1
  • 시작 위치: 좌하단 (0, 0)

이동하면서 경유한 좌표값에 +1하고, 범위를 벗어나는 경우 무시할 것
이때 가장 많이 방문된 좌표와 그 횟수를 구하는 문제

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int size = sc.nextInt();         // 격자 크기 (size x size)
        int moves = sc.nextInt();        // 이동 횟수

        // 2차원 격자 초기화 (모든 칸 0)
        Vector<Vector<Integer>> grid = new Vector<>();
        for (int i = 0; i < size; i++) {
            Vector<Integer> row = new Vector<>();
            for (int j = 0; j < size; j++) row.add(0);
            grid.add(row);
        }

        int x = 0, y = 0;                // 시작 위치: (0, 0)
        grid.get(y).set(x, 1);           // 시작 위치 방문 처리

        for (int i = 0; i < moves; i++) {
            String dir = sc.next();      // 방향: N/S/E/W
            int dist = sc.nextInt();     // 이동 거리

            for (int d = 0; d < dist; d++) {
                int nx = x, ny = y;

                // 방향에 따라 다음 위치 계산
                switch (dir) {
                    case "N": ny++; break;
                    case "S": ny--; break;
                    case "E": nx++; break;
                    case "W": nx--; break;
                }

                // 격자 밖으로 벗어나면 무시
                if (nx < 0 || nx >= size || ny < 0 || ny >= size) continue;

                // 위치 갱신 및 방문 처리
                x = nx; y = ny;
                grid.get(y).set(x, grid.get(y).get(x) + 1);
            }
        }

        // 최다 방문 좌표 및 방문 횟수 찾기
        int max = 0, maxX = 0, maxY = 0;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                int val = grid.get(i).get(j);
                if (val > max) {
                    max = val;
                    maxX = j;
                    maxY = i;
                }
            }
        }

        // 결과 출력: 최다 방문 좌표, 방문 횟수
        System.out.println(maxX + ", " + maxY);
        System.out.println(max);
    }
}

profile
(와.. 정말 Chill하다..)

0개의 댓글