Language/Java

[Java] Java의 동적 배열

i-m-okay 2024. 10. 16. 19:20

우테코 1주차 문제를 해결하면서 필요해보이는 개념을 이곳에 정리해보려 한다.

기존의 Java 내 배열은 정적 배열로, 선언할 때부터 크기를 설정해주어야 했다.

그러나, 해당 문제의 입력 길이가 정해지지 않았기 때문에 동적 배열을 사용할 필요성을 느꼈다.

Java에서는 대표적인 동적 배열로 ArrayList를 지원한다.

 

Java oracle document - ArrayList

오라클이 제공하는 자바의 공식 도큐먼트에서는 ArrayList가 무엇으로 구현되었는지 등의 정보를 볼 수 있다.

[https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html]

공식 도큐먼트를 보면, ArrayList가 Object > AbstractCollection > AbstractList 를 상속했음을 알 수 있다.
List, RandomAccess, Cloneable, Serializable 를 구현했다는 것 또한 명시되었다.

각각이 무엇인지 간단하게 알아보자.

Object

자바가 객체 없이는 못 사는 언어라는 것은 모두가 알고 있다.
자바에 존재하는 대부분의 것들은 객체를 상속받고 있다. 즉, 객체다.
원시타입과 static, null, void를 제외하고 자바 속 거의 대부분의 것들이 객체일 정도로 자바에게 객체는 빼놓을 수 없는 개념이다.

AbstractionCollection

  • 모든 Collection 클래스가 상속받을 수 있는 추상 클래스
  • 직접 인스턴스화 할 수 없다.
    => 하위 클래스로 상세한 메서드를 구현한다.
  • Collection 인터페이스를 구현

Collection이 무엇인지는 아래를 참고~~

https://i-m-okay.tistory.com/8

 

[Java] Collection framework

collection framework?데이터 군을 저장하는 클래스들을 표준화한 설계.데이터 군을 다루고 표현하기 위한 단일화된 구조.컬렉션 : 다수의 데이터. 데이터 그룹프레임웍 : 표준화된 프로그래밍 방식JDK

i-m-okay.tistory.com

 

AbstractList

  • List 컬렉션의 동작을 미리 정의해둔 클래스
  • List 인터페이스를 구현
  • 순차적인 접근, 인덱스를 이용한 요소 관리 메서드를 제공

ArrayList

  • 동적 크기 조정 가능 (내부적으론 배열을 사용)
  • 초기 크기를 초과할 경우 더 큰 배열을 할당하고 복사하는 방식
    => 원시타입 배열보다 속도가 느리다는 단접이있다.
  • 삽입/삭제 O(n), 접근 O(1)
  • 중복 허용, 순서 유지

ArrayList의 주요 메서드

  • add(E e) ; 리스트 맨 뒤에 요소 추가
  • add(int index, E e) ; 인덱스에 요소를 삽입하고 하나씩 뒤로 밀기
  • get(int index) ; 해당 인덱스 요소 반환
  • set(int index, E e) ; 인덱스 요소를 새로운 값으로 교체
  • remove(int index) ; 인덱스 요소 제거 후 하나씩 당기기
  • size() ; 요소 개수 반환
  • contains(Object o) ; 해당 객체가 있는지 확인

원시타입으로 선언하면?

동적 배열보다 속도면에서는 빠르다.
(동적 배열은 정해진 길이를 초과했을 경우의 복사하는 방식에서 시간이 걸린다.)

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // ArrayList 생성
        ArrayList<String> list = new ArrayList<>();

        // 요소 추가
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 요소 접근
        System.out.println(list.get(0));  // Apple 출력

        // 요소 삽입
        list.add(1, "Blueberry");  // Banana 앞에 Blueberry 삽입

        // 요소 제거
        list.remove(2);  // Cherry 제거

        // 리스트 출력
        System.out.println(list);  // [Apple, Blueberry, Banana] 출력
    }
}

ArrayList va LinkedList

  • ArrayList는 빠른 요소 접근에 유리
  • LinkedList는 삽입과 삭제에 유리

본격 비교는 예전에 올렸던 아래 게시글에서 했다.

https://i-m-okay.tistory.com/10

 

[Java] ArrayList vs LinkedList

ArrayList vs LinkedListArrayList기존의 Vector를 개선한 것Object 배열을 이용해 데이터를 순차적으로 저장더이상 저장할 공간이 없으면 큰 새로운 배열을 생성하여 내용을 복사해서 확장중간 요소 삭제

i-m-okay.tistory.com