본문 바로가기
자료 구조/기본 개념

[자료 구조] 8. List 인터페이스

글: Song hyun 2024. 5. 9.
728x90
반응형

[자료 구조] 8. List 인터페이스

 

1. List 인터페이스란?

2. List 인터페이스의 주요 메서드

3. List 인터페이스 구현체

4. 예제


1. List 인터페이스란?

(1) List 인터페이스의 개념

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

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

 

(2) List 인터페이스의 특징

(2-1) 순서 유지:

(2-2) 중복 허용: List는 같은 값을 가진 원소의 중복 저장을 허용한다. 예를 들어, 같은 값을 여러번 리스트에 

(2-3) 가변 크기: List 의 구현체들은 동적으로 크기가 조절된다. (<->배열) 즉, 원소를 추가하거나 제거함에 따라, 리스트의 크기가 자동으로 조정된다.


 

2. List 인터페이스의 주요 메서드

(1) add(E element) :

(2) get(int index) :

(3) remove(int index) :

(4) indexOf (Object o) : 지정된 객체가 처음으로 나타나는 위치의 인덱스를 반환한다. 객체가 리스트에 포함되지 않은 경우, -을 반환한다. 

(5) size() : 리스트에 있는 원소의 수를 반환한다.


3. List 인터페이스 구현체

(1) Collection : 

(2) List : 내부적으로 배열을 사용하여 요소를 관리하는 List 구현체이다. 요소를 무작위 접근이 빠르다는 장점이 있다.

(3) ArrayList : 내부적으로 배열을 사용하여, 요소를 관리하는 List 구현체이다. 요소의 무작위 접근이 빠르다는 장점이 있다.

(4) LinkedList : 내부적으로 연결 리스트를 사용하여 요소를 관리하는 List 구현체이다. 요소의 삽입과 삭제가 빠르다,

(5) Vector : ArrayList와 유사하지만, 모든 메서드가 동기화되어 있어, 멀티 스레드 환경에서 안전하게 사용할 수 있다.

 

*제네릭(<>): 제네릭은 타입의 명시화이다.

 


아래의 예제를 통해 얕은 복사와 깊은 복사의 개념에 대해 알아보자.

 

*얕은 복사(Shallow Copy): 원본 객체의 데이터가 아닌, 원본 객체의 주소값을 복사하는 것이 얕은 복사이다.

즉, 새로운 복사본이 하나 생기는 것이 아니라, 복사본은 원본 객체의 주소값을 가리키는 것이기에, 객체의 수는 그대로이다. (=인터넷 아이콘의 '바로가기'와 유사하다!) 얕은 복사를 한 객체의 값을 수정하면, 원본 객체의 값이 함께 수정된다.

** 깊은 복사(Deep Copy): 원본 객체의 데이터를 그대로 복사한다. 즉 주소값을 복사하는 것이 아닌, 데이터 그 자체를 그대로를 복사하는 것이기에 객체의 수는 2가 된다. 깊은 복사를 할 시, 복사본을 수정해도 원본에는 변함이 없다.


 

package Structure.ch05;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import basic.ch05.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); // 리스트에 null 삽입
		list.add(1,10); // = 1번째 인덱스에 10을 넣어라.
		// 기존 요소가 있다면 뒤로 자동 이동
		System.out.println("값 추가 확인 : "+list);

		// 참조 변수에는 주소값(4바이트)이 포함된다.
		// 하지만 List의 값을 호출시, 주소값이 아닌 데이터가 호출된다.
		// 이는 toString이 오버라이딩 되어있기 때문.
		
		// 값 삭제
		list.remove(2); // 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; // 복사 개념 (list는 int형 정수를 받는다.)
		// 복사 개념 필수!!!! 얕은 복사 개념!
		System.out.println(list);
		System.out.println("------------");
		list.add(1000);
		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));
		
		// Iterator 요소 순회(반복자)
		Iterator<Integer> iter = nums.iterator();
		while(iter.hasNext()) {
			System.out.println("while을 활용하는 방법 : "+iter.next());
		}
		
	} // end of main

}
728x90
반응형