Java

2024.05.09 자료구조(Data Structure) List 인터페이스

정훈5 2024. 5. 9. 09:21

List 인터페이스

자바에서 객체를 순서대로 저장하고 관리할 수 있도록 설계된 인터페이스입니다.

자바의 java.util 패키지에 속하며, 배열이나 연결 리스트 등의 순차적 자료 구조의 구현체를 위한 메서드를 정의합니다.

 

List 인터페이스의 주요 특징

  1. 순서 유지
    List 인터페이스를 구현하는 자료 구조는 원소들이 삽입된 순서를 유지합니다.
    이는 원소들이 리스트 내에서 특정 위치(index)를 가지며, 이 인덱스를 통해 접근할 수 있다는 것을 의미합니다.
  2. 중복 허용
    List는 같은 값을 가진 원소의 중복 저장을 허용합니다.
    예를 들어, 같은 값을 여러 번 리스트에 추가할 수 있으며,
    이는 리스트의 크기를 증가시키고 각각의 원소는 별도의 인덱스를 갖게 됩니다.

  3. 가변 크기
    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.lang.reflect.Array;
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>();

		// 변수에 선언과 동시에 초기화 ---> 값이 들어가 있는 상태인가? -> 아니다, 공간만 선언한 것이다.
		// 뒤에 Integer 타입추론이 가능하여 생략 가능하다.
		// 값을 동시에 추가 하고 싶다면
		ArrayList<Integer> num2 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

		// String 값만 들어갈 수 있다.
		ArrayList<String> vocabulary = new ArrayList<String>();

		// 뒤에 String 타입추론이 가능하여 생략 가능하다.
		ArrayList<Student> members = new ArrayList<>();

		// 클래스의 정의 된 기능을 알아 봐야 한다.
		// 값 추가 하는 방법
		List.add(3);
		List.add(null);
		List.add(1, 10); // 인덱스 1번 위치에 Element 요소 10을 삽입, 기존 요소가 있다면 뒤로 자동 이동 (밀어내기)
		System.out.println("갑 추가 확인 : " + List);

		Student student = new Student("홍박사");
		System.out.println(student);

		// 값 삭제하는 방법
		List.remove(2); // 인덱스(index) 2번 요소를 삭제해라.
		System.out.println("갑 삭제 확인 : " + List);

		// 값 전체 삭제하는 방법
		// List.clear();
		System.out.println("전체 삭제 확인 : " + List);

		// 리스트 사이즈 확인 (요소의 갯수, 사이즈 개념)
		System.out.println("리스트 사이즈 확인 : " + List.size()); // 요소의 개수를 확인한다.

		// 하나의 요소를 꺼내는 방법
		try {
			System.out.println("하나의 요소를 꺼내기 : " + List.get(0));
		} catch (Exception e) {
			System.out.println("프로그램이 종료 되지 않게 처리");
		}

		// ArrayList 와 반복문에 활용
		// List에 선언된 것이 Int 도 있고 String 이 있기에 최상위 Object로 잡힌다. 숫자로 인식을 못했음

		nums = List; // 복사 개념 - 필 !!!! 얕은 복사 개념 !!!! 중요
		System.out.println(List);
		System.out.println("-----------");
		List.add(10000); // 추가 기능
		System.out.println("nums : " + nums);
		// 얕은 복사 개념 !!!! 중요
		System.out.println("List : " + List);

		// ArrayList 와 반복문에 활용
		// List에 선언된 것이 Int 도 있고 String 이 있기에 최상위 Object로 잡힌다. 숫자로 인식을 못했음

		// for (Integer i : nums) {} <-- List 는 컴파일 시점에 Object 타입으로 인식

		for (Integer i : nums) {
			System.out.println("i : " + i);
		} // for-each

		// ArrayList 안에 값이 포함 되어 있는가 확인 하는 방법 --> contains()
		System.out.println("3이 nums 리스트에 존재하는 가? --> " + nums.contains(3)); // true
		System.out.println("500이 nums 리스트에 존재하는 가? --> " + nums.contains(500)); // false

		// 요소의 위치 (index) 확인 --> indexOf()
		// 값이 없다면 -1 을 반환한다.
		System.out.println("Element 요소 3이 몇 번째 index에 위치 하니 -> " + nums.indexOf(3));
		System.out.println("Element 요소 10이 몇 번째 index에 위치 하니 -> " + nums.indexOf(10));
		System.out.println("Element 요소 500이 몇 번째 index에 위치 하니 -> " + nums.indexOf(500));

		// Iterator 요소 순회(반복자) 를 시키고 싶을 때
		Iterator<Integer> iter = nums.iterator();
		while (iter.hasNext()) { // hasNext : 반복 시킴
			System.out.println("while 을 활용하는 방법 : " + iter.next()); // 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()); 
		}
		
		// 어떤 데이터를 정렬을 하려면 정렬 알고리즘을 구현해서 기능을 만들어 주면 된다. 
		// 버블 정렬, 퀵, 선택 가능 .... 
		// 자바 표준 API 사용 
		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;
	}
	
	public String getTitle() {
		return title;
	}

	public int getRating() {
		return rating;
	}

	@Override
	public String toString() {
		return "Movie [title=" + title + ", rating=" + rating + "]";
	}	
}