많은 데이터를 저장하고 처리하기 위한 프로그램을 만들 때
기본형식으로 배열을 사용할 수 있다.
하지만 배열을 사용하면 정렬 및 기타 기능을 사용할 때 값을 꺼내고 삭제하기가 복잡하여 관리상의 불편함이 생길 수 있다.
때문에 다양한 자료구조(Data Struct)를 이용하여 관리하게 되는데 자바에서 기본 제공하는 형식이 있어서 이를 활용하면 편리하게 작업할 수 있다!
바로
대표적으로 List, Set, Map이 있다
리스트는 선형자료구조로, 일직선으로 이루어진 구조에 데이터를 저장한다.
순서가 있으며, 값의 중복을 허용한다.
리스트를 구현하고 있는 java.util.List 클래스는 인터페이스라서 객체를 생성할 수 없다. 따라서 List를 implement하는 다른 클래스를 사용한다.
대표적으로는 ArrayList 가 있다.
ArrayList list = new ArrayList();
이렇게 처음으로 리스트를 생성했을 때 길이를 확인하면 0으로 나온다. 이 뒤로 값을 추가하거나 삭제하면 자동으로 길이가 변경된다.
참고로 리스트를 포함한 컬렉션들은 대부분 toString이 오버라이딩 되어있어 list 객체를 그대로 출력해도 값을 바로 확인 할 수 있다.
리스트의 길이를 확인하는 함수는 size( )이다.
list.size( )는 리스트의 길이를 반환한다.
리스트의 값을 추가하는 함수는 add( )이다.
list.add( )는 리스트의 가장 마지막에 요소를 추가한다.
(return type은 boolean이다.
반환된 내용이 true면 list에 요소가 잘 담겼다는 뜻이다.)
add( index, E e )
위 함수는 list의 특정 인덱스에 값을 집어넣을 수 있다.
그 인덱스의 값은 지워지는 것이 아니라 한칸씩 뒤로 밀려난다.
즉, 덮어쓰기가 아니다!
리스트의 값을 삭제하는 함수는 remove( )이다.
list.remove( ) 안에 삭제하고 싶은 값을 그대로 집어넣으면 해당 값에 해당하는 요소를 삭제하지만
해당 값이 정수면 index값으로 인식하여 엉뚱한 값이 삭제될 수 있다.
다시말해, remove( )안에 정수입력은 리스트의 특정 인덱스의 값을 삭제할 때 사용한다.
ex) list.remove( 10 )
값이 '10'인 요소를 삭제하는 것이 아닌
리스트의 인덱스가 10번째인 값을 삭제한다.
( 이럴때에는 list.remove(Integer.valueOf( 10 ))을 사용하면 좋다 )
add와 마찬가지로 삭제된 곳은 null로 존재하는 것이 아니라 뒤의 값들이 한칸씩 앞으로 이동하게 된다.
리스트의 특정 인덱스의 값을 가져올 때 사용한다.
ex) list.get(0)
리스트의 0번째 인덱스의 값을 반환한다.
지정한 위치의 값을 바꿀 때 사용한다.
ex) list.set(0,60)
0번째 값을 60으로 바꾸어라
list.clear를 사용하면 리스트의 모든 값을 한번에 비울 수 있다.
리스트가 주어졌을때 비어있는 리스트인지 아닌지 확인할 때 유용하다.
boolean값을 반환한다.
리스트 내부에 특정 값이 포함되어 있는지 판별하는 함수다.
booelan값을 반환한다.
ex) list.contains("LOVE")
리스트 내에 LOVE 라는 글자가 포함되어있는지 확인한다.
내장되어있는 정렬함수를 이용하거나 다른 클래스를 이용하여 정렬할 수 있다.
list.sort( null );
System.out.println( list );
null 자리에는 정렬 기준을 나타내기 위한 객체를 전달할 수 있다
null로 설정되면 기본값인 오름차순으로 정렬이 된다.
※ Comparable은 Integer, Double, String 등의 인터페이스를 구현하고 있다. 따라서 위 자료형은 배열 및 리스트에서 sort 함수를 이용해 기본값으로도 정렬이 가능하다.

↑ 예시) Integer 클래스에 implements된 Comparable
위에 적었듯이 Comparable 덕분에 Integer, Double, String은 큰 힘을 들이지 않고 정렬이 가능하다.
하지만 위 자료형이 아닌 다른 자료형들은 sort를 사용해 정렬이 불가능하다.
따라서 이때에는 Comparator 인터페이스를 통해 직접 정렬을 구현해주어야 한다!
Book 클래스가 존재할 때 내부의 필드는 String name (도서명), int price (도서 가격)가 있다고 쳐보자.
그리고 이 Book객체들을 담은 list가 있을 때 이 리스트를 이름순으로 정렬하고 싶을 때 코드를 구현해보자!!
import java.util.ArrayList;
import java.util.Comparator;
class Book {
String name;
int price;
public Book(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public String toString() { // toString 오버라이딩 해줘야 바로 리스트 출력 가능
return String.format("%s : %,d", name, price);
}
}
public class Ex03 {
public static void main(String[] args) {
ArrayList<Book> list = new ArrayList<>();
Book b1 = new Book("자바의 정석", 25000);
Book b2 = new Book("스프링 부수기", 26000);
Book b3 = new Book("서블릿 기초", 18000);
Book b4 = new Book("파이썬 입문코딩", 30000);
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
// 인터페이스 Comparator 를 객체화하기 위해 내부에서 직접 추상메서드 구현
Comparator<Book> comp = new Comparator<>() {
@Override
public int compare(Book o1, Book o2) {
return o1.name.compareTo(o2.name);
}; // 이름 오름차순으로 정렬
};
list.sort(comp);
list.forEach(c -> System.out.println(c));
}
}
list는 특별히 자료형을 지정하지 않으면, 내부에 Object를 저장하기 때문에 모든 유형의 객체를 저장할 수 있다.
(제네릭 타입 지정X)
ArrayList list = new ArrayList();
list.add(10);
list.add(20);
list.add("ITBANK");
list.add(3.14);
System.out.println(list);
출력
[ 10, 20, ITBANK, 3.14 ]
반대로 리스트에 한 가지의 자료형만을 넣고 싶다면 제네릭 타입을
지정해주면 된다.
ArrayList<Book> list2 = new ArrayList<>( );
(Book타입의 자료형만 집어넣을 수 있는 리스트)
참고로 제네릭 타입으로 primitive type을 넣을 수 없다.
오직 Reference type만 넣을 수 있다.