[자료 구조] 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
}
'자료 구조 > 기본 개념' 카테고리의 다른 글
[자료 구조] 10. Set 인터페이스 (0) | 2024.05.10 |
---|---|
[자료 구조] 9. List 인터페이스 활용 : 영화 평점 관리 시스템 예제 만들기 (0) | 2024.05.09 |
[자료 구조] 7. 컬렉션 프레임 워크 (0) | 2024.05.09 |
[자료 구조] 6. 연결 리스트 (0) | 2024.05.08 |
[자료 구조] 6. 큐 구현하기 (0) | 2024.05.07 |