리스트

Java의 데이터 타입과 예외

Jim White

Java Developer

List 인터페이스

  • List 인터페이스, Collection의 하위 인터페이스
    • 객체의 순서가 있는 그룹 정의
    • 중복 객체 허용
  • List의 여러 구현
    • 동작은 유사함
    • 구현에 따라 내부 관리 방식이 달라짐
Java의 데이터 타입과 예외

List 구현체

  • ArrayList: 크기 조절 가능, 인덱스(배열처럼) 기반, 순서 있는 객체 리스트

ArrayList는 인덱스가 있는 Java 배열과 유사

  • LinkedList: 다음/이전 객체로 연결된 리스트

LinkedList는 포인터로 연결된 객체 리스트

  • 구현과 관계없이 추가, 제거, 변경 방식은 동일
1 List 타입과 세부사항은 https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html 참고
Java의 데이터 타입과 예외

ArrayList

  • new로 인스턴스 생성, 제네릭으로 내용 타입 지정
  • .add(object)로 끝에 추가
  • .get(index)로 접근
    • ArrayList는 0부터 시작
  • .set(index, object)로 교체
  • .remove(index)로 제거
  • .clear()로 모두 비우기
  • .size()로 개수 확인
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // 중복 허용
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// 첫 번째 horse 제거 animals.remove(0); // 모든 객체 제거 animals.clear();
animals.size();
Java의 데이터 타입과 예외

객체와 기본형

  • 기본형을 컬렉션에 추가하려면 래퍼 사용
  • 추가 시 "오토박싱"됨
    • 오토박싱: 기본형을 자동으로 래퍼로 감싸는 과정
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6이 자동으로 Integer로 감싸진 뒤 추가
  • 오토박싱은 모든 컬렉션 프레임워크 객체에 적용
Java의 데이터 타입과 예외

이종 컬렉션

  • 컬렉션 프레임워크의 자료구조는 이종일 수 있음
    • 이종 = 서로 다른 타입의 객체를 보관
    • 제네릭 타입에 Object 사용
ArrayList<Object> list = new ArrayList<Object>(); // 어떤 객체든 허용
list.add(new Integer(5)); // Integer 추가
list.add(6); // 오토박싱으로 Integer 추가
list.add("Hello"); // String 추가
Java의 데이터 타입과 예외

List 순회

  • List의 객체를 순회하려면 for-each 구문 사용
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // ArrayList 전체 순회
    System.out.println(animal);
}
horse
cow
chicken
Java의 데이터 타입과 예외

List println

  • List 인스턴스(예: ArrayList)의 내용은 println으로 출력 가능
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // ArrayList의 모든 요소 출력

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // ArrayList의 모든 요소 출력
[horse, cow, chicken]
[5, Hello]
Java의 데이터 타입과 예외

LinkedList

  • LinkedListArrayList처럼 생성합니다
  • LinkedListArrayList와 같은 메서드를 가집니다
import java.util.LinkedList;
...
LinkedList<String> cars // 새 ... 생성
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // 객체 추가
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // 객체 교체
System.out.println(cars); // 리스트 출력
cars.remove(0); // 객체 제거
cars.clear();  // 전체 제거
cars.size(); // 길이 확인
[Ford, Toyota]
Java의 데이터 타입과 예외

LinkedList 추가 메서드

  • 추가 메서드
    • addFirst() 시작 위치에 추가
    • addLast() 끝에 추가
    • removeFirst() 시작에서 제거
    • removeLast() 끝에서 제거
cars.addFirst("Fiat"); // 맨 앞에 추가
cars.addLast("BMW"); // 맨 뒤에 추가
cars.removeFirst(); // 첫 객체 제거
cars.removeLast(); // 마지막 객체 제거
Java의 데이터 타입과 예외

컬렉션 타입의 유사성

  • ArrayListLinkedList는 비슷해 보임
    • 컬렉션 프레임워크의 다른 타입도 유사점이 있음
    • 의도된 설계임
  • 공통 인터페이스: List
    • 다형성의 예시
Java의 데이터 타입과 예외

ArrayList vs LinkedList

  • ArrayListLinkedList(또는 임의의 List)의 연산은 동일
    • 어떤 List를 쓸지는 용도에 따라 결정
  • ArrayList 고려사항:
    • 임의 접근이 빠름(예: list.get(11))
    • 중간에 추가/삭제는 느림
    • 삽입/삭제 시 객체를 물리적으로 이동해야 함

ArrayList 중간에 추가하면 많은 이동이 필요

Java의 데이터 타입과 예외

ArrayList vs LinkedList

  • LinkedList 고려사항:
    • 임의 접근은 느림(예: list.get(11))
    • 중간에 추가/삭제가 빠름
    • 객체를 옮기지 않고 참조만 몇 개 변경

LinkedList 중간에 추가하면 포인터만 일부 변경

Java의 데이터 타입과 예외

연습해 봅시다!

Java의 데이터 타입과 예외

Preparing Video For Download...