List 인터페이스 - 7

목차

    List 인터페이스

     

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

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

    1. List 인터페이스의 주요 특징

    • 순서 유지 : List 인터페이스를 구현하는 자료 구조는 원소들이 삽입된 순서를 유지.
      이는 원소들이 리스트 내에서 특정 위치(index)를 가지며, 이 인덱스를 통해 접근할 수 있다는 것을 의미.
    • 중복 허용 : List는 같은 값을 가진 원소의 중복 저장을 허용.
      예를 들어, 같은 값을 여러 번 리스트에 추가할 수 있으며,
      이는 리스트의 크기를 증가시키고 각각의 원소는 별도의 인덱스를 가짐.
    • 가변 크기 : List의 구현체들은 동적으로 크기가 조절됨.
      즉, 원소를 추가하거나 제거함에 따라 리스트의 크기가 자동으로 조정됩니다.

    2. 주요 메서드

    • add(E element) : 리스트의 끝에 원소를 추가.
    • get(int index) : 지정된 위치의 원소를 반환.
    • remove(int index) : 지정된 위치의 원소를 제거하고 그 원소를 반환.
    • indexOf(Object o) : 지정된 객체가 처음으로 나타나는 위치의 인덱스를 반환.
      객체가 리스트에 포함되어 있지 않은 경우 -1을 반환.
    • size(): 리스트에 있는 원소의 수를 반환.

    3. 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>();
    		// 변수 선언과 동시에 초기화 --> 값이 들어가 있는 상태인가?
    		// 값을 동시에 추가 하고 싶다면
    		ArrayList<Integer> num2 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
    
    		ArrayList<String> vocabulary = new ArrayList<String>();
    		ArrayList<Student> members = new ArrayList<>();
    
    		// 클래스에 정의된 기능을 알아봐야 한다.
    		// 값 추가 방법
    		list.add(3 + 3);
    		list.add(null);
    		// list.add("abc");
    		list.add(1, 10); // index 1위치에 요소 10을 삽입, 기존 요소 있었다면 뒤로 자동 이동
    		System.out.println("값 추가 확인 : " + list);
    
    		// 값 삭제
    		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 와 반복문의 활용
    		nums = list; // nums가 뭘로 선언 되었든 걍 주소 가져옴
    		System.out.println(list);
    		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("6이 nums 리스트에 존재 하는가? --> " + nums.contains(6));
    		System.out.println("500이 nums 리스트에 존재 하는가? --> " + nums.contains(500));
    		
    		// 요소의 위치(index) 확인
    		System.out.println("요소 6이 몇 번째 인덱스에 위치 하니 -> " + nums.indexOf(6));
    		System.out.println("요소 10이 몇 번째 인덱스에 위치 하니 -> " + nums.indexOf(10));
    		System.out.println("요소 500이 몇 번째 인덱스에 위치 하니 -> " + nums.indexOf(500));
    		
    		// Iterator 요소 순회( 반복자 )
    		Iterator<Integer> iter = nums.iterator();
    		while(iter.hasNext()) {
    			System.out.println("while을 활용하는 방법 : " + iter.next());
    		}
    		
    		// 배열, ArrayList
    	}
    
    }
    그럼 배열을 쓸 필요가 없을까?
    크기가 정해져 있다면 배열을 사용하는 것이 검색이 빠르다

    도전 학습

    예제 개념: 영화 평점 관리 시스템

    상황 설명
    사용자가 영화에 평점을 주고, 평점에 따라 영화 추천 목록을 관리하는 시스템입니다. 사용자는 영화에 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<>();
    		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("------------------------");
    		// 정렬 코드
    		Collections.sort(movies, new Comparator<Movie>() {
    			@Override
    			public int compare(Movie m1, Movie m2) {
    				return Integer.compare(m2.getRating(), m1.getRating());
    			}
    		});
    		for (int i = 0; i < movies.size(); i++) {
    			System.out.println(movies.get(i).getTitle());
    		}
    		
    		// 어떤 데이터를 정렬 하려면 정렬 알고리즘을 구현해서 기능을 만들어 주면 된다.
    		// 버블 정렬, 퀵, ...
    		
    	} // 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 + "]";
    	}
    
    }

    자료 구조(Data Structure) - 4으로 돌아가기

     

    'Java > 자료구조' 카테고리의 다른 글

    Map 인터페이스 - 9  (0) 2024.05.13
    Set 인터페이스 - 8  (0) 2024.05.10
    컬렉션 프레임 워크 - 6  (0) 2024.05.09
    LinkedList 구현해보기 - 5  (0) 2024.05.08
    큐(Queue) 구현하기 - 4  (0) 2024.05.07