위로 아래

List 클래스

List<Integer> listA = new List<String>();
  1. 배열의 한계 때문에 만들어진 자료형.
  2. 메모리가 허용하는 한 동적으로 계속해서 추가할 수 있도록 만들어진 자료형 클래스 
  3. 배열과 다르게, 빈 요소를 허용하지 않음.
  4. 배열과 다르게, 메모리상에 불연속적으로 메모리들을 차지하고 있어서 메모리 낭비가 없고 관리가 편하다
  5. 포인터를 통하여 다음 메모리 위치를 가리키고 있어서 삽입, 삭제가 용이함.
  6. 순서가 있는 객체를 중복 여부와 상관 없이 저장하는 리스트 자료구조를 지원
  7. 배열이 가지고 있는 인덱스라는 장점을 버리고, 빈틈 없는 데이터의 적재라는 장점을 취함.
  8. 인덱스를 사용하고 싶다면, 생성할 때 ArrayList 생성자를 이용하면 ArrayList 타입으로 변환할 수 있다 (ArrayList 클래스는 List 인터페이스의 구현 클래스)
  9. java.util.List 
  10. List클래스는 콜렉션(java.util.Collection) 인터페이스를 구현한 구현클래스.

 

 

List에서 사용하는 대표적인 함수들

  1. 리스트명.add("값") : List에 자료를 넣을 때 사용.
  2. 리스트명.get(인덱스) : List의 데이터를 가져올 때 사용
  3. 리스트명.set(인덱스,"바꿀값") : List의 데이터 값을 바꿀 때 사용
  4. 리스트명.isEmpty() : List가 비어있는지 확인
  5. 리스트명.size() : List의 길이를 리턴할 때 사용
  6. 리스트명.contains("해당값") : List에 해당값이 있으면 true, 아니면 false 리턴
  7. 리스트 참조변수명 = Arrays.asList(배열명) : 배열을 리스트로 변환
  8. 배열 참조변수명 = 리스트명.toArrays(new String[0]) : 리스트를 배열로 변환
  9. List.of ("~") : 불변 리스트.
  10. remove : 파라메타 타입에 따라 두 가지 종류로 나뉜다.
    1. 리스트명.remove("삭제 값") : 삭제 성공하면 true, 실패하면 false 리턴.
    2. 리스트명.remove(인덱스) : 삭제가 성공하면 삭제한 값을 리턴.

 

배열과 리스트의 차이

  저장 방식 크기 할당 속도 크기
Array 배열 정해진 공간이 있고, 인덱스 번호가 존재
str [i]
정적.
크기 할당 필요
크기가 고정이라 중간 요소가 삭제되면 빈 공간으로 내버려둬야 한다. -> 메모리 낭비
데이터 삽입/삭제 : 느림
데이터 조회 : 빠름
length
List 리스트 인덱스 번호가 없음. 앞의 요소가 삭제되면 새로 추가되는 요소가 그 공간에 저장 동적.
크기 할당 필요 X
용량 초과시 자동으로 1.5배씩 늘어남
데이터 삽입/삭제 : 빠름
데이터 조회 : 느림
size
ArrayList 인덱스 번호 사용 가능. 동적.
크기 할당 필요 X
용량 초과시 자동으로 늘어남
데이터 삽입/삭제 : 빠름
데이터 조회 : 느림
size

ArrayList는 배열(Array)과 리스트(List)의 장점을 합친 것! 인덱스를 쓸 수 있는 List.

 

 

 

 

예시

더보기
import java.util.*;

public class ListDemo {
	public static void main(String[]args) {
		String[] animals1 = {"사슴","호랑이","바다표범","곰"};
		
		List<String> animals2 = Arrays.asList(animals1);
		animals2.set(1, "앵무새");
		//animals2.add("늑대");
		
		for(String s : animals2)
			System.out.print(s + " ");
		System.out.println();
		
		animals2.sort((x,y)->x.length() - y.length());
		String[] animals3 = animals2.toArray(new String[0]);
		for(int i=0;i<animals3.length;i++)
			System.out.print(animals3[i]+" ");
		System.out.println();
		
		List<String> cars = List.of("그랜저","소나타","아반테","제네시스");
		// car.set(1, "싼타페")
		cars.forEach(s -> System.out.print(s+ " "));
		
		//List <Object> objects = List.of("a", null);
	}
}

ArrayList 클래스

// ArrayList 생성 방법
ArrayList<String> a1 = new ArrayList<String>(50);   //capacity를 50으로 설정. (기본값 10)
  1. Arrays 클래스의 메소드가 아니다. 별개의 것.
  2. 배열을 기반으로 한 콜렉션의 하나.
  3. 배열 안의 중간 데이터를 추사하거나 삭제할 시, 동적으로 배열의 길이가 조절된다.
  4. 초기 용량은 10, 용량을 초과할 경우 배열의 크기를 1.5배로 증가시킨다
  5. 배열과의 다른 점 : 배열은 길이가 고정되어 있으나, ArrayList는 배열의 길이를 자동으로 조절해주어 가변적이다

예시

더보기
import java.util.*;

public class ArrayListDemo {
	public static void main(String[] args) {
		List<String> list = List.of("그랜저", "소나타", "아반테", "제네시스", "소울");

		System.out.println(list.indexOf("소나타"));
		System.out.println(list.contains("소나타"));
		
		List<String> cars1 = new ArrayList<>(list);
		cars1.add("싼타페");
		List<String> cars2 = new ArrayList<>(list);
		cars2.remove("제네시스");
		System.out.println(cars1.containsAll(cars2));
		
		cars1.removeIf(c -> c.startsWith("소"));
		cars1.replaceAll(s -> "뉴" + s);
		cars1.forEach(s -> System.out.print(s + " "));
		System.out.println();
		
		cars1.clear();
		System.out.println(cars1.isEmpty());
	}
}

 

 

 

 

Car 예시

더보기
public interface CarPredicate {
	boolean test(Car car);
}
public interface CarConsumer {
	void accept(Car car);
}
import java.util.*;

public class Car {
	private String model;
	private boolean gasoline;
	private int age;
	private int mileage;
	
	public Car(String model, boolean gasoline, int age, int mileage) {
		this.model =  model;
		this.gasoline = gasoline;
		this.age = age;
		this.mileage = mileage;
	}
	
	public String getModel() { return model; }
	public boolean isGasoline() { return gasoline; }
	public int getAge() { return age; }
	public int getMileage() { return mileage; }
	
	public String toString() {
		return String.format("Car(%s,%s,%d,%d)", model, gasoline, age, mileage);
	}
	
	public static final List<Car> cars = Arrays.asList(
			new Car("소나타", true, 18, 210000),
			new Car("코란도", false, 15, 200000),
			new Car("그랜저", true, 12, 150000),
			new Car("싼타페", false, 10, 220000),
			new Car("아반테", true, 10, 70000),
			new Car("에쿠스", true, 6, 100000),
			new Car("그랜저", true, 5, 80000),
			new Car("소나타", true, 2, 35000),
			new Car("쏘렌토", false, 1, 10000),
			new Car("아반테", true, 1, 7000)
			);
}
import java.util.*;

public class Cardemo {

	public static void main(String[] args) {
		List<Car> dieselCars = findCars(Car.cars, c -> !c.isGasoline());
		System.out.println("디젤 자동차 = " + dieselCars);
		
		List<Car> oldCars = findCars(Car.cars, c -> c.getAge() > 10);
		System.out.println("오래된 자동차 = " + oldCars);
		
		List<Car> oldDieselCars = findCars(Car.cars, c-> c.getAge()>10 && !c.isGasoline());
		System.out.println("오래된 디젤 자동차 = "+ oldDieselCars);
		
		System.out.println("디젤 자동차 = ");
		printCars(dieselCars, c -> System.out.printf("%s(%d)",c.getModel(), c.getAge()));
		System.out.println("\n오래된 자동차 = ");
		printCars(oldCars, c -> System.out.printf("%s(%d, %d)", c.getModel(), c.getAge(), c.getMileage()));
	}

	public static List<Car> findCars(List<Car> all, CarPredicate cp){
		List<Car> result = new ArrayList<>();
		
		for(Car car : all) {
			if(cp.test(car))
				result.add(car);
		}
		return result;
	}
	
	public static void printCars(List<Car> all, CarConsumer cc) {
		for (Car car : all)
			cc.accept(car);
	}
	
}