배열 & ArrayList

최수연·2026년 1월 24일

Java 코딩테스트

목록 보기
4/8

배열

특징

  • 배열의 크기(길이)는 변경할 수 없음.
    ⇒ 정적 할당(static allocation), 불변(immutable)
  • 데이터가 메모리에 연속적으로 나열되어 있기 때문에 인덱스를 통한 접근 속도가 빠름
  • 인덱스를 통해 데이터를 삭제하더라도 해당 위치는 빈 공간으로 계속 남음

배열의 선언

int[] points = new int[3];
int[] points2 = new int[] {1, 3, 5};
int[] points3 = {1, 3, 5}

배열의 순회

  • for문
for(int i = 0; i < intArry.length; i++) {
	int x = intArray[i];
	System.out.println(x);
}
  • for-Each문
for(int x : intArray) {
	System.out.println(x);
}



배열의 API 활용 : Arrays


  • 배열 정렬
int[] arry = {10, 5, 8, 20, 3};
Arrays.sort(arry);    // {3, 5, 8, 10, 20}

  • 배열의 최댓값
int[] arry = {10, 5, 8, 20, 3};
int max = Arrays.stream(arry).max().getAsInt();    // 20

  • 배열의 최솟값
int[] arry = {10, 5, 8, 20, 3};
int max = Arrays.stream(arry).min().getAsInt();    // 3

  • 배열의 복사
int[] arry = {10, 5, 8, 20, 3};
int[] copy = Arrays.copyOf(arry, arry.length);    // 배열 그대로 복사
int[] copyExtends = Arrays.copyOf(arry, 5);       // 배열 크기를 늘려서 복사

⇒ 원본 배열은 변경되지 않고 새로운 배열 객체를 생성
⇒ 배열 크기를 늘린 경우 기본형 배열은 0, 객체 배열은 null로 채워짐


** Arrays.copyOf()와 System.arraycopy()

  • System.arraycopy(원본배열, 원본 배열 복사 시작 인덱스, 새배열, 새배열의 복사 시작 인덱스, 복사할 요소 개수)
  • Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)

⇒ Arrays.copyOf는 System.arraycopy를 래핑한 함수임. 즉, 동일한 기능을 함. 하지만, Arrays.copyOf가 조금 더 직관적이라 더 많이 사용됨



다차원 배열 순회/탐색

다차원(특히 2차원) 배열에서 상하좌우의 값을 탐색하는 경우 delta 배열을 이용하여 탐색하면 효율적임

  • 좌/우 탐색
    delta = {(0, -1), (0, 1)}
  • 상/하 탐색
    delta = {(-1, 0), (1, 0)}
  • 4방 탐색
    delta = {(-1, 0), (0, -1), (0, 1), (1, 0)}
  • 8방 탐색
    delta = {(-1, -1), (-1, 0), (1, 0), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)}



Collection : ArrayList

특징

  • 리스트의 길이는 가변적임
    ⇒ 동적 할당(dynamic allocation), 가변(mutable)
  • 데이터가 메모리에 연속적으로 나열되어 있지 않기 때문에 인덱스를 통한 접근 속도가 비교적 느림
  • 데이터가 삭제되면 해당 공간은 삭제됨

ArrayList의 생성

// 기본 생성
ArrayList<Integer> list1 = new ArrayList<>();

// 초기 용량(capacity) 지정
ArrayList<Integer> list2 = new ArrayList<>(10);

// 배열을 넣어 생성
ArrayList<Integer> list3 = new ArrayList<>(Arrays.asList(1, 2, 3));

ArrayList의 추가

ArrayList<Integer> list1 = new ArrayList<>();

list1.add(1);    // {1}
list1.add(2);    // {1, 2}
list1.add(3);    // {1, 2, 3}
  • addAll() 메서드
ArrayList<String> list1 = new ArrayList<>(Arrays.asList(1, 2));
ArrayList<String> list2 = new ArrayList<>(Arrays.asList(3, 4));

list1.addAll(list2);    // list1에 list2의 내용 추가

⇒ 컬렉션 자체를 ArrayList에 추가할 수 있음


ArrayList의 삭제

ArrayList<String> list1 = new ArrayList<>(Arrays.asList(1, 2));

// 1번째 인덱스 요소 삭제
list1.remove(1);    // {1}

// list1의 데이터 모두 삭제
list1.clear();

ArrayList의 검색

ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));

// 특정 인덱스에 저장된 객체 반환
list1.get(1);    // B

// list에 A가 있는지 검색
list1.contains("A");    // true

// list에 A가 있는지 순차적으로 검색하고 index를 반환 (만일 없으면 -1)
list1.indexOf("A");    // 0

ArrayList의 요소 변경

ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));

// 특정 인덱스 값을 설정값으로 변환
list1.set(1, "D");    // {"A", "D", "C"}

ArrayList의 크기

ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));

list1.size();    // 3

0개의 댓글