본문 바로가기
Java

자바 중급 2편 - ArrayList(1)

by KongJiHoon 2025. 7. 7.

배열의 특징 1 - 배열과 인덱스

✅ 자료 구조란?

  • 여러 데이터를 구조화해서 다루는 방식
  • 자바는 배열 외에도 컬렉션 프레임워크를 통해 다양한 자료 구조 제공

✅ 배열에서의 입력, 변경, 조회

 

작업시간 복잡도 설명
입력 (arr[0] = 1) O(1) 인덱스로 위치 바로 접근
변경 (arr[2] = 10) O(1) 인덱스 위치 값만 수정
조회 (System.out.println(arr[2])) O(1) 인덱스로 빠르게 조회 가능
 
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[2] = 10;
System.out.println(arr[2]); // 10

✅ 배열의 검색

  • 특정 값을 찾기 위해 배열을 순회하며 비교 필요 → O(n)
  • 검색 예시:
int value = 10;
for (int i = 0; i < arr.length; i++) {
    if (arr[i] == value) {
        System.out.println(value + " 찾음");
        break;
    }
}

✅ 배열의 메모리 구조

배열은 메모리상 연속적으로 배치되어 있음

  • int → 4바이트
  • 공식: 시작주소 + (자료 크기 * 인덱스)

 

인덱스 메모리 주소
arr[0] x100
arr[1] x104
arr[2] x108
 

📊 빅오(Big O) 표기법

✅ 개요

  • 알고리즘의 성능 변화 추세를 수학적으로 표현
  • 입력 데이터가 커질수록 연산량의 변화를 기준으로 측정

✅ 주요 표기

표기 설명 예시
O(1) 상수 시간 인덱스를 이용한 조회
O(n) 선형 시간 배열 검색, 전체 순회
O(n²) 이중 루프 이중 반복문
O(log n) 로그 시간 이진 탐색
O(n log n) 정렬 알고리즘 등 병합정렬 등
 

✅ 배열과 빅오

연산 시간 복잡도
인덱스 접근 O(1)
검색 O(n)
 

➕ 배열의 특징 2 - 데이터 추가

✅ 데이터 추가 위치별 동작

위치 설명 시간 복잡도
첫 번째 모든 데이터를 오른쪽으로 한 칸 이동 O(n)
중간 해당 인덱스 오른쪽 데이터만 이동 O(n)
마지막 바로 추가 O(1)
 
package com.example.collection.array;

import java.util.Arrays;

public class ArrayMain2 {

    public static void main(String[] args) {

        int[] arr = new int[5];

        arr[0] = 1;
        arr[1] = 2;

        System.out.println(Arrays.toString(arr));

        // 배열의 첫번째 위치에 추가
        // 기본 배열의 데이터를 한 칸씩 밀고 배열의 첫번째 위치에 추가
        System.out.println("배열의 첫번째 위치에 3 추가 O(n)");
        int newValue = 3;
        addFirst(arr, newValue);

        System.out.println(Arrays.toString(arr));

        // index 위치에 추가
        // 기본 배열의 데이터를 한 칸씩 밀고 배열의 index위치에 추가
        System.out.println("배열의 index(2) 위치에 4 추가 O(n)");
        int index = 2;

        int value = 4;

        addAtIndex(arr, index, value);
        System.out.println(Arrays.toString(arr));
        

    }

    private static void addAtIndex(int[] arr, int index, int value) {

        for (int i = arr.length - 1; i > index ; i--) {
            arr[i] = arr[i - 1];
        }

        arr[index] = value;

    }

    private static void addFirst(int[] arr, int newValue) {

        for (int i = arr.length - 1; i > 0; i--) {

            arr[i] = arr[i - 1];

        }

        arr[0] = newValue;

    }

}

 


✅ 배열의 한계

  • 크기를 생성 시 미리 고정해야 함
  • 동적으로 크기를 조절할 수 없음
  • 이벤트 참여자 수처럼 예측 불가능한 경우에 한계

📌 정리


기능 시간 복잡도 특징
인덱스 접근 O(1) 빠름
검색 O(n) 느림
데이터 추가 (마지막) O(1) 효율적
데이터 추가 (앞/중간) O(n) 비효율적
크기 변경 ❌ 불가능 정적 구조

 

출처 : 김영한 자바 - 중급 2편

'Java' 카테고리의 다른 글

자바 중급 2편 - ArrayList(3)  (0) 2025.07.20
자바 중급 2편 - ArrayList(2)  (0) 2025.07.19
자바 중급 2편 - 제네릭(4)  (0) 2025.06.01
자바 중급 2편 - 제네릭(3)  (0) 2025.05.31
자바 중급 2편 - 제네릭(2)  (0) 2025.05.15