Java | ArrayList 기본, Generics

BOZZANG·2022년 4월 21일
0

Java

목록 보기
2/2

🎇 ArrayList

ArrayListArray를 이용해서 List를 구현한 것을 의미한다.
장점은 내부적으로 Array를 이용하기 때문에, Index를 이용한 접근이 빠르다.
단점은 데이터의 추가와 삭제가 느리다.

ListArray의 가장 큰 차이는 크기가 정해져 있지 않고 동적으로 변한다는 점이다.


🔗 데이터의 추가

ArrayList는 내부적으로 데이터를 Array에 저장한다.
Array의 특성상 데이터를 List의 처음이나 중간에 정하면 이후의 데이터들이 한칸씩 뒤로 물러나야 한다.

(Index, Value)
(0,10) (1,20) (2,30) (3,40) <- (2,50) 추가하면
(0,10) (1,20) (2,50) (3,30) (4,40)

🔗 데이터의 삭제

삭제도 추가와 비슷하다. 빈자리가 생기면 채우기 위해서 순차적으로 한 칸 씩 땡겨야 한다.

(Index, Value)
(0,10) (1,20) (2,50) (3,30) (4,40) -> (1,20) 삭제하면
(0,10) (1,50) (2,30) (3,40) 

🔗 데이터를 가져오기

Index를 이용해서 데이터를 가져오고 싶을 때 Array로 구현한 List는 매우 빠르다. 메모리 상의 주소를 정확히 참조해서 가져오기 때문이다.
Index를 안다는 것은 주소를 알고 있는 것과 같다.


🎇 Java ArrayList

Java에서 ArrayList는 가장 많이 사용되는 Data Structrue이다. 특히 Java의 Array는 동일한 데이터 타입의 요소만 담을 수 있고, 크기가 고정되어 있기 때문에 사용하기 까다롭다.

Collection 프레임워크의 일부이며, java.util 패키지에 소속되어있다.

표준 배열보다는 느리지만 배열에서 많은 조작이 필요한 경우 유용하게 사용할 수 있다.

List 인터페이스에서 상속받아 사용이 된다.

ArrayList는 객체가 추가되어 용량을 초과하면 자동으로 부족한 크기만큼 용량이 늘어난다.

<List 자료형>
List 자료형에는 ArrayList, Vector, LinkedList 등의 List 인터페이스를 구현한 자료형이 있다. 
여기서 말하는 List 자료형은 인터페이스라고 한다. 

🔗 ArrayList 생성

ArrayListjava.util.ArrayList에 포함되어 있기 때문에, import를 해줘야 한다.

import java.util.ArrayList;

🔗 ArrayList 선언

// 타입을 설정하지 않고 Object로 사용
ArrayList my = new ArrayList();  // 선호되는 방법 x

// Animal 객체로 선언 
ArrayList<animal> my = new ArrayList<animal>(); // (generics)

// int 타입으로 선언
ArrayList<Integer> my = new ArrayList<Integer>(); // (generics)
ArrayList<Integer> my = new ArrayList<>(); // 가장 선호되는 방식 (generics)

// 선언과 동시에 초기 용량 설정 
ArrayList<Integer> my = new ArrayList<Integer>(10);

// 선언과 동시에 초기 값 설정
ArrayList<Integer> my = new ArrayList<Integer>(Arrays.asList(1,2,3,4)); 
import java.util.Arrays;

~
int[] num = {1,2,3,4,5};
ArrayList<Integer> my = new ArrayList<>(Arrays.asList(num));

java.util.Arrays 클래스의 asList 메소드를 사용해서 이미 존재하는 문자열 배열로 ArrayList를 생성할 수 있다.

위의 선언과 동시에 초기 값 설정에도 사용할 수 있으며, import를 해줘야 한다.


🔗 add

import java.util.ArrayList;

public class Sample {
	public static void main(String[] args) {
    	ArrayList numbers = new ArrayList();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
       }
  }

어느 위치에 값을 삽입하고 싶다면

numbers.add(0,1); // 첫번째 위치에 0 삽입

🔗 get

ArrayListget 메소드를 이용하면 특정 인덱스의 값을 추출할 수 있다.

System.out.println(numbers.get(0));
10

🔗 size

size 메소드는 ArrayList의 갯수를 리턴한다.

System.out.println(numbers.size());
3

🔗 contain

contain 메소드는 List 안에 해당 항목이 있는지를 판별하여 그 결과를 boolean으로 리턴한다.

System.out.println(numbers.contains(34));
false

🔗 remove

remove 메소드에는 2가지 방식이 있다.

1. remove(객체)

2. remove(인덱스)

첫 번째 remove(객체)List에서 객체에 해당되는 항목을 삭제하고,
삭제한 결과 (true, false)를 리턴한다.

System.out.println(numbers.remove(10));
true

10이 삭제되고 true를 리턴했다.

두 번째 remove(인덱스)의 경우는 해당 인덱스의 항목을 삭제하고 삭제된 항목을 리턴한다.

System.out.println(numbers.remove(1));
20 

numbers의 1번째 항목 20을 삭제한 후, 20을 리턴했다.


🎇 Generics

Java는 J2SE 5.0버전 이후부터 ArrayList<Integer> my = new ArrayList<>();처럼 객체를 포함하는 자료형도 어떤 객체를 포함하는지에 대해서 명확하게 표현할 것을 권고 하고 있다.

다음과 같은 것이 Generics, 제네릭스이다.

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

하지만 보통 뒷 부분의 자료형은 굳이 적지 않아도 명확하기 때문에,
다음의 표기법을 사용하는 것이 좋다.

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

Generics가 도입되기 전에는 위의 코드를 아래와 같이 사용했다.

ArrayList my = new ArrayList();

두 개의 차이점은 자료형 타입 바로 옆에 <Integer>와 같은 문구의 유무이다.

위에서 사용한 <Integer>이라는 Generics 표현은
"ArrayList 안에 담을 수 있는 자료형은 Integer타입 뿐이다"라는 것을 의미한다.

<String>, <Fruits> 등 어떤 자료형도 사용할 수 있다.

즉, Generics를 사용하면 좀 더 명확한 타입체크가 가능해진다.
사용하지 않을 경우에는 ArrayList 안에 추가되는 객체는 Object 자료형으로 인식된다.
Object 자료형은 모든 객체가 상속하고 있는 가장 기본적인 자료형이다.

// Generics 사용 x

ArrayList num = new ArrayList();
num.add("100");
num.add("200");

String oneHundred = (String) num.get(0);

따라서 ArrayList의 객체인 num에 값을 넣을 때는 문제가 안되지만,
값을 가져올 경우에는 항상 Object 자료형에서 String 자료형으로 다음과 같이 형변환(casting)을 해줘야 한다.

또한 이렇게 형변환을 하다 보면 이로 인한 오류가 발생할 가능성이 있기 때문에 Generics가 탄생하게 된 것이기도 하다.

// Generics 사용 o

ArrayList<Integer> num = new ArrayList<>();
num.add(100);
num.add(200);

String oneHundred = (num.get(0);

Generics로 자료형을 선언하면 그 이후에는 자료형에 대한 형변환 과정이 필요없다. 이미 컴파일러가 num에는 반드시 Integer 자료형만 추가 되어야 함을 알기 때문이다. 이렇게 Generics를 통해 형변환에 의한 불필요한 코딩과 잘못된 형변환에 의한 런타임 오류를 방지할 수 있다.


🎇 String.join

String.join("구분자", 리스트객체)를 사용하여 리스트의 각 요소에 "구분자"를 삽입하여 하나의 문자열로 만들 수 있다.
리스트 말고도 문자열 배열에도 사용할 수 있다.

import java.util.ArrayList;
import java.util.Arrays;
~
ArrayList<String> animals = new ArrayList<>(Arrays.asList("강쥐","냥","꽥"));
String result = String.join("+",animals);
System.out.println(result + " =" + " 슈퍼기욤");
강쥐++= 슈퍼기욤

🎇 리스트 정렬하기

리스트의 sort 메소드를 사용한다.

import java.util.Comparator

Comparator.naturalOrder() : 오름차순(순방향) 정렬

Comparator.reverseOrder() : 내림차순(역방향) 정렬

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

~
	ArrayList<String> animals = new ArrayList<>(Arrays.asList("삐	약","냥","꽥"));
	animals.sort(Comparator.naturalOrder());
	// 오름차순 정렬
	animals.sort(Comparator.reverseOrder());
	// 내림차순 정렬

참고 Wikidocs

0개의 댓글