List 인터페이스
자바에서 객체를 순서대로 저장하고 관리할 수 있도록 설계된 인터페이스.
자바의 java.util 패키지에 속하며, 배열이나 연결 리스트 등의 순차적 자료 구조의 구현체를 위한 메서드를 정의한다.
List 인터페이스의 주요 특징
- 순서 유지: List 인터페이스를 구현하는 자료 구조는 원소들이 삽입된 순서를 유지한다. 이는 원소들이 리스트 내에서 특정 위치(index)를 가지며, 이 인덱스를 통해 접근할 수 있다는 것을 의미한다.
- 중복 허용: List는 같은 값을 가진 원소의 중복 저장을 허용합니다. 예를 들어, 같은 값을 여러 번 리스트에 추가할 수 있으며, 이는 리스트의 크기를 증가시키고 각각의 원소는 별도의 인덱스를 갖게 됩니다.
- 가변 크기: List의 구현체들은 동적으로 크기가 조절됩니다. 즉, 원소를 추가하거나 제거함에 따라 리스트의 크기가 자동으로 조정됩니다.
주요 메서드
- add(E element): 리스트의 끝에 원소를 추가한다.
- get(int index): 지정된 위치의 원소를 반환한다.
- remove(int index): 지정된 위치의 원소를 제거하고 그 원소를 반환한다.
- indexOf(Object o): 지정된 객체가 처음으로 나타나는 위치의 인덱스를 반환한다. 객체가 리스트에 포함되어 있지 않은 경우 -1을 반환한다.
- size(): 리스트에 있는 원소의 수를 반환한다.
List 인터페이스 구현체
Collection
|
└── List
├── ArrayList
├── LinkedList
└── Vector
├ .....
- Collection: 모든 컬렉션 클래스의 최상위 인터페이스
- List: Collection 인터페이스를 확장하는 순서가 있는 컬렉션을 위한 인터페이스. 리스트는 중복을 허용하며, 각 요소가 삽입된 순서에 따라 인덱스로 접근할 수 있다.
- ArrayList: 내부적으로 배열을 사용하여 요소를 관리하는 List 구현체. 요소의 무작위 접근이 빠르다는 장점이 있다.
- LinkedList: 내부적으로 연결 리스트를 사용하여 요소를 관리하는 List 구현체. 요소의 삽입과 삭제가 빠르다는 장점이 있다.
- Vector: ArrayList와 유사하지만, 모든 메서드가 동기화되어 있어 멀티 스레드 환경에서 안전하게 사용할 수 있다.
package structure.ch05;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import basic.ch22.Student;
public class MyArrayListTest {
// 메인 쓰레드
public static void main(String[] args) {
List mList; // 리스트 인터페이스 계열
// ArrayList 클래스의 인스턴스화 처리
ArrayList list = new ArrayList();
// 제네릭은 추후에 더 설명
// 제네릭은 타입의 명시화이다.
ArrayList<Integer> nums = new ArrayList<Integer>();
// 변수의 선언과 동시에 초기화 → 값이 들어가 있는 상태인가?
// 값을 동시에 추가하고 싶다면 → Arrays.asList
ArrayList<Integer> num2 = new ArrayList<>(Arrays.asList(1,2,3,4,5)); // Integer 생략 가능
ArrayList<String> vocabulary = new ArrayList<String>();
ArrayList<Student> members = new ArrayList<>();
// 클래스의 정의 된 기능들을 알아보자.
// 값을 추가 하는 방법
list.add(3);
list.add(null);
list.add(1, 10); // index 1 위치에 요소 10을 삽입, 기존에 요소가 있었다면 뒤로 자동으로 이동.
System.out.println("값 추가 확인 : " + list);
Student student = new Student("학생");
System.out.println(student);
// 값을 삭제하는 방법
list.remove(2); // 두 번째 인덱스에 있는 요소를 삭제
System.out.println("값 삭제 확인 : " + list);
// 전체 삭제
//\ list.clear();
System.out.println("전체 삭제 확인 : " + list);
// 리스트 사이즈 확인 (리스트 → 요소의 개수이자 사이즈 개념)
System.out.println(list.size());
// 하나의 요소를 꺼내는 방법
// System.out.println(list.get(0)); // 0번째 인덱스에 아무 요소가 없기 때문에 오류 발생
try {
System.out.println(list.get(0));
} catch (Exception e) {
System.out.println("프로그램이 종료 되지 않게 처리");
}
// ArrayList와 반복문 활용
nums = list; // 복사 개념 ★★★★★ 얕은 복사 개념 ★★★★★
System.out.println(list);
System.out.println("--------------");
list.add(10000); // 추가 기능
System.out.println(nums);
// for(Integer i : list) {} <- list는 컴파일 시점에 Object 타입으로 인식
for(Integer i : nums) {
System.out.println(" i : " + i);
}
// ArrayList 안에 값이 포함되어 있는지 확인하기
System.out.println("3이 nums 리스트에 존재 하는가?" + nums.contains(3));
System.out.println("500이 nums 리스트에 존재 하는가?" + nums.contains(500));
// 요소의 위치 (index) 확인
System.out.println("요소 3이 몇 번째 인덱스에 위치 하는가? : " + nums.indexOf(3));
System.out.println("요소 10이 몇 번째 인덱스에 위치 하는가? : " + nums.indexOf(10));
System.out.println("요소 500이 몇 번째 인덱스에 위치 하는가? : " + nums.indexOf(500));
// Interator 요소 순회 ( 반복자 )
Iterator<Integer> iter = nums.iterator();
while(iter.hasNext()) {
System.out.println("while문을 활용하는 방법 : " + iter.next());
}
// 배열, ArrayList 사용해야 할 때를 알자 !!
} // end of main
} // end of class
예제 - 영화 평점 관리 시스템
사용자가 영화에 평점을 주고, 평점에 따라 영화 추천 목록을 관리하는 시스템. 사용자는 영화에 1부터 5까지의 평점을 줄 수 있으며, 평점이 높은 영화부터 낮은 순으로 정렬하여 보여준다.
package structure.ch05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class MovieRatingSystem {
public static void main(String[] args) {
// Movie라는 Object를 계속 추가하는 자료구조를 만들려 한다.
ArrayList<Movie> movies = new ArrayList<Movie>();
movies.add(new Movie("범죄도시 4", 5));
movies.add(new Movie("기생충", 4));
movies.add(new Movie("올드보이", 5));
movies.add(new Movie("인생은 아름다워", 3));
System.out.println(movies);
for (Movie movie : movies) {
System.out.println(movie.getTitle());
}
System.out.println("------------------");
for (int i = 0; i < movies.size(); i++) {
// 배열이 아님 -> get() 메서드를 사용함
System.out.println(movies.get(i).getTitle());
}
// 어떤 데이터를 정렬 하려면 정렬 알고리즘을 구현하여 기능을 만들어 주면 된다.
// 버블 정렬, 퀵 정렬, 삽입 정렬 등 등 ..
Collections.sort(movies, new Comparator<Movie>() {
@Override
public int compare(Movie m1, Movie m2) {
return Integer.compare(m2.getRating(), m1.getRating());
}
});
System.out.println("-----------------------");
// 평점 순으로 정렬된 영화 목록 출력
for(Movie movie : movies) {
System.out.println(movie);
}
} // end of main
} // end of class
class Movie {
private String title;
private int rating;
public Movie(String title, int rating) {
this.title = title;
this.rating = rating;
}
// getter
public String getTitle() {
return title;
}
public int getRating() {
return rating;
}
@Override
public String toString() {
return "Movie [title=" + title + ", rating=" + rating + "]";
}
}'Java' 카테고리의 다른 글
| Map 인터페이스 (0) | 2024.05.23 |
|---|---|
| Set 인터페이스 (1) | 2024.05.21 |
| LinkedList 구현 (2) | 2024.05.14 |
| 큐(Queue) 구현하기 (0) | 2024.05.14 |
| 배열을 활용한 Stack 구현 (0) | 2024.05.14 |