본문 바로가기
학습/JAVA

13. List 인터페이스 (ArrayList)

by Elfen Lied 2022. 11. 7.
반응형

- ArrayList

  • 저장순서 유지
  • 중복 허용

- 재네릭을 지정하지 않은 경우

package chap13;

import java.util.ArrayList;

public class Sample01 {
	/*
		List인터페이스 : ArrayList
		저장순서 유지, 중복 허용
	*/
	
	public static void main(String[] args) {
		// 재네릭을 지정하지 않으면 모든 자료를 추가할 수 있음
		ArrayList list = new ArrayList();
		boolean add = list.add(5);
		System.out.println("객체 추가 : " + add);
		list.add(5);
		list.add(2);
		list.add(1);
		list.add(3);
		list.add("abc");
		System.out.println(list);
		
		// 재네릭 타입을 지정하지 않으면 Object 타입으로 받아온다.
		Object object = list.get(3);
		int idx0 = (int) list.get(0); // 타입캐스팅 필요
		int idx1 = (int) list.get(1); // 타입캐스팅 필요
		System.out.println(idx0 + idx1);
	}
}


값
객체 추가 : true
[5, 5, 2, 1, 3, abc]
10

 

 

- 재네릭을 지정한 경우

  • ArrayList<E> 타입이 결정 되지않은 상태인데,
  • E에 타입을 정하면 그때 타입이 결정된다.
package chap13;

import java.util.ArrayList;

public class Sample02 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("자바");
		list.add("오라클");
		list.add("JSP");
		list.add("스프링");
		list.add("통합구현");
		System.out.println(list);
		
		// 컬렉션의 크기
		System.out.println("컬렉션의 크기 : " + list.size());
		
		// 재네릭 타입을 지정하면 지정된 타입으로 받아온다.
		// 타입캐스팅 불필요
		String str = list.get(0);
//		list.add('a'); // 지정하지 않은 타입은 에러가 난다.
//		list.add(10);
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}

값
[자바, 오라클, JSP, 스프링, 통합구현]
컬렉션의 크기 : 5
자바
오라클
JSP
스프링
통합구현

 

 

 

- list.add 지정해서 값 나타내기

package chap13;

import java.util.ArrayList;
import java.util.List;

public class Sample03 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple");
		list.add("kiwi");
		list.add("grape");
		list.add("banana");
		list.add("orange");
		
		System.out.println(list);
		// [apple, kiwi, grape, banana, orange]
		
		// 지정된 위치 값 추가
		list.add(2, "MELON");
		System.out.println(list);
		// [apple, kiwi, MELON, grape, banana, orange]

		// 지정된 위치 값 수정
		list.set(0, "사과");
		System.out.println(list);
		// [사과, kiwi, MELON, grape, banana, orange]
	}
}

값
[apple, kiwi, grape, banana, orange]
[apple, kiwi, MELON, grape, banana, orange]
[사과, kiwi, MELON, grape, banana, orange]

 

 

- 삭제하기

package chap13;

import java.util.ArrayList;
import java.util.List;

public class Sample04 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple");
		list.add("kiwi");
		list.add("grape");
		list.add("banana");
		list.add("orange");
		
		// 인덱스 번호로 삭제
		list.remove(1); // kiwi 삭제
		System.out.println(list);
		
		// 지정한 객체 삭제
		list.remove("apple");
		System.out.println(list);
		
		// 리스트가 비어있나?
		System.out.println(list.isEmpty());
		
		// 리스트의 모든 객체 삭제
		list.clear();
		System.out.println(list.isEmpty());
		System.out.println(list);
	}
}

값
[apple, grape, banana, orange]

[grape, banana, orange]

false

true

[]

 

 

- remove 유의 사항

package chap13;

import java.util.ArrayList;
import java.util.List;

public class Sample05 {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
	
		list.remove(1); // 인덱스 번호로 인식
		System.out.println(list);
		
//		list.remove(new Integer(3)); // deprecated 
		list.remove(Integer.valueOf(3));
		System.out.println(list);
	}
}

값
[1, 3, 4, 5]
[1, 4, 5]

 

 

 

- enum 사용했을때

package sec01;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import sec01.Apple.Color;

public class Sample06 {
	public static void main(String[] args) {
		List<Apple> apples = new ArrayList<Apple>();
		apples.add(new Apple(Color.RED));
		apples.add(new Apple(Color.RED));
		apples.add(new Apple(Color.RED));
		apples.add(new Apple(Color.RED));
		System.out.println(apples);
		
		apples.remove(new Apple(Color.RED));
		System.out.println(apples);
	}
}

class Apple {
	public enum Color{RED, BLUE, GREEN, YELLO}
	
	Color color;
	
	public Apple(Color color) {
		this.color = color;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Apple other = (Apple) obj;
		return color == other.color;
	}

	@Override
	public int hashCode() {
		return Objects.hash(color);
	}

	@Override
	public String toString() {
		return "Apple [color=" + color + "]";
	}
	
}

값
[Apple [color=RED], Apple [color=RED], Apple [color=RED], Apple [color=RED]]
[Apple [color=RED], Apple [color=RED], Apple [color=RED]]

equals를 오버라이딩 해주기전엔 삭제가 안되지만,

equals를 오버라이딩 해주면 삭제 됨.

 

 

 

- addAll()

package sec02;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Sample01 {
	public static void main(String[] args) {
		List<String> list1 = new ArrayList<String>();
		list1.add("zz");
		list1.add("cc");
		list1.add("bb");
		System.out.println(list1);

		List<String> list2 = new ArrayList<String>();
		list2.add("11");
		list2.add("22");
		list2.add("33");
		System.out.println(list2);
		
		// list1에 매개값으로 주어진 컬렉션의 모든 요소 추가
		// 매개변수 타입 : Collection (List, Set)
		// Collection<? extends E>
		// ? : 와일드 카드, 타입파라미터로 무엇이든 전달할 수 있다.
		// E : String 타입으로 결정된다.
		// Collection<? extends String>
		// 와일드 카드로 전달할 수 있는 타입변수는 String 또는 String상속(구현)타입
		
		list1.addAll(list2);
		System.out.println(list1);
		
		// Collection<? extends Number>
		// Collection<Number> : ok
		// Collection<Integer> : ok
		// Collection<Double> : ok
		// Collection<String> : 컴파일 에러
		
		// 원하는 인덱스 위치에 요소 추가
		List<String> list3 = new ArrayList<String>();
		list3.add("가");
		list3.add("나");
		list1.addAll(2, list3);
		System.out.println(list1);
		
	}
}

값
[zz, cc, bb]
[11, 22, 33]
[zz, cc, bb, 11, 22, 33]
[zz, cc, 가, 나, bb, 11, 22, 33]

 

 

- removeAll()

공통요소들 다 뺀다.

package sec02;

import java.util.ArrayList;
import java.util.List;

public class Sample02 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>(List.of("a", "b", "c", "b", "e"));
		List<String> param = new ArrayList<String>(List.of("b", "c", "k"));
		
		System.out.println(list);
		System.out.println(param);
		
		list.removeAll(param);
		System.out.println(list);
	}
}

값
[a, b, c, b, e]
[b, c, k]

[a, e]

 

 

 

- retainAll()

공통요소만 남긴다

package sec02;

import java.util.ArrayList;
import java.util.List;

public class Sample03 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>(List.of("a", "b", "c", "d", "e"));
		List<String> param = new ArrayList<String>( List.of("z", "b", "f", "c"));
		
		list.retainAll(param);
		System.out.println(list);
	}
}

값
[b, c]

 

 

- indexOf()

왼쪽에서부터 검색

 

- lastIndexOf

오른쪽에서부터 검색

 

- contains()

포함여부

package sec02;

import java.util.ArrayList;
import java.util.List;

public class Sample04 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple");
		list.add("kiwi");
		list.add("grape");
		list.add("banana");
		list.add("apple");
		list.add("orange");
		
		System.out.println(list);
		
		// 지정된 객체의 인덱스 반환 : 해당 객체가 없으면 -1 반환
		int idx1 = list.indexOf("apple"); // 0 왼쪽 -> 오른쪽 최초 발견 인덱스 반환
		System.out.println(idx1);
		
		int idx2 = list.indexOf("melon"); // -1
		System.out.println(idx2);
		
		int idx3 = list.lastIndexOf("apple"); // 오른쪽 -> 왼쪽
		System.out.println(idx3);
		
		// contains() 객체가 포함되어 있는지 여부
		if(list.contains("apple")) {
			System.out.println("사과가 포함되어 있음");
		}
		
		if(list.contains("melon")) {
			System.out.println("멜론이 포함되어 있음");
		} else {
			System.out.println("멜론을 포함하지 않음");
		}
	}
}

값
[apple, kiwi, grape, banana, apple, orange]
0
-1
4
사과가 포함되어 있음
멜론을 포함하지 않음

 

 

- clone()

clone()을 쓰기보다 객체를 하나더 만들어주자

package sec02;

import java.util.ArrayList;
import java.util.List;

public class Sample05 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple");
		list.add("kiwi");
		list.add("grape");
		list.add("banana");
		list.add("apple");
		list.add("orange");
		
		// list.clone(); 그냥 못쓰고 타입변환 해줘야함
		// clone()을 쓰기보다 하나더 생성하는게 낫다
		ArrayList<String> clone = (ArrayList<String>) ((ArrayList<String>)list).clone();
		System.out.println(clone);
		
		// 이 방법을 쓰자
		List<String> copy = new ArrayList<String>(list);
		System.out.println(copy);
	}
}

값
[apple, kiwi, grape, banana, apple, orange]
[apple, kiwi, grape, banana, apple, orange]

 

 

 

- subList()

  • fromIndex부터 toIndex사이에 지정된 객체 리스트 반환
  • toIndex는 포함되지 않는다
package sec02;

import java.util.ArrayList;
import java.util.List;

public class Sample06 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); //0
		list.add("kiwi"); //1
		list.add("grape"); //2
		list.add("banana"); //3
		list.add("orange"); //4
		
		List<String> subList = list.subList(1, 3);
		System.out.println(subList);
		
		List<String> subList2 = list.subList(0, list.size());
		System.out.println(subList2);
	}
}

값
[kiwi, grape]
[apple, kiwi, grape, banana, orange]

 

 

- Iterator<E>

- hasNext() [1]

다음 요소가 존재하는지의 여부

package sec02;

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

public class Sample06 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); //0
		list.add("kiwi"); //1
		list.add("grape"); //2
		list.add("banana"); //3
		list.add("orange"); //4
		
		Iterator<String> it = list.iterator();
		System.out.println(it.hasNext());
		System.out.println(it.next()); // 다음요소 : apple
		System.out.println(it.hasNext());
		System.out.println(it.next()); // 다음요소 : kiwi
		System.out.println(it.hasNext());
		System.out.println(it.next()); // 다음요소 : grape
		System.out.println(it.hasNext());
		System.out.println(it.next()); // 다음요소 : banana
		System.out.println(it.hasNext());
		System.out.println(it.next()); // 다음요소 : orange
		System.out.println(it.hasNext());
		
//		System.out.println(it.next()); 예외 발생 java.util.NoSuchElementException
	}
}

값
true
apple
true
kiwi
true
grape
true
banana
true
orange
false

hasNext() 없이 next()만 썼을 경우,

다음 요소가 없으면 예외 발생함

예외 문구 :  java.util.NoSuchElementException

 

- hasNext() [2]

 

package sec02;

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

public class Sample08 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); //0
		list.add("kiwi"); //1
		list.add("grape"); //2
		list.add("banana"); //3
		list.add("orange"); //4
		
		// 반복자 얻기
		Iterator<String> it = list.iterator();
		while (it.hasNext()) { // 반복할 요소가 있다면
			System.out.println(it.next());
		}
		
		// 1회 반복을 수행한 반복자 객체는 더 이상 반복되지 않는다.
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		
		// 반복을 수행하려면 반복자를 다시 얻어야함
		it = list.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

값
apple
kiwi
grape
banana
orange
apple
kiwi
grape
banana
orange

 

 

 

- forEachRemaining()

  • 익명구현객체
  • 람다식
  • 메소드 참조 : 단순히 메소드에 파라미터를 전달할때만 가능
package sec02;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

public class Sample09 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); //0
		list.add("kiwi"); //1
		list.add("grape"); //2
		list.add("banana"); //3
		list.add("orange"); //4
		
		// Consumer<? extends String>
		// String 또는 String 타입을 상속(구현)한 클래스타입
		// Consumer<? super String>
		// String 또는 String 타입의 상위클래스 또는 인터페이스
		// @FunctionalInterface : 추상메소드가 하나인 인터페이스, 람다식으로 표현할 수 있음
		Iterator<String> it = list.iterator();
		it.forEachRemaining(new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t.length());
			}
		});
		// 익명구현객체
		it = list.iterator();
		it.forEachRemaining(new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println(t);
			}
		});
		
		// 람다식
		System.out.println("=============람다식============");
		it = list.iterator();
		it.forEachRemaining(t -> System.out.println(t));
		
		// 메소드 참조
		System.out.println("===========메소드 참조==========");
		it = list.iterator();
		it.forEachRemaining(System.out::println);
	}
}



값
5
4
5
6
6
apple
kiwi
grape
banana
orange
=============람다식============
apple
kiwi
grape
banana
orange
===========메소드 참조==========
apple
kiwi
grape
banana
orange

 

 

 

- 반복자 얻어서 문자열 해당하는 값 제거하기

package sec02;

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

public class Sample10 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		Iterator<String> it = list.iterator();
		// 문자열"e"로 끝나는 값 제거
		while (it.hasNext()) {
			if(it.next().endsWith("e")) it.remove();
		}
		System.out.println(list);
	}
}


값
[kiwi, banana]

 

 

 

- ListIterator<E>

  • iterator()보다 개선됐다
  • iterator()은 next()만 있는 반면 listIterator()는 뒤로도 갈 수 있다.

package sec02;

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

public class Sample11 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		ListIterator<String> it = list.listIterator();
		System.out.println("==========다음요소반복===========");
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		
		// 만약 it.next 부분을 주석으로 막으면 실행안됨
		// 이전으로 갈 요소가 없기때문
		System.out.println("==========이전요소반복===========");
		while (it.hasPrevious()) {
			System.out.println(it.previous());
		}
		
		// nextIndex()가 위에오면 인덱스0번부터 시작
		// next()가 위에오면 인덱스1번부터 시작
		System.out.println("===========================");
		while (it.hasNext()) {
			System.out.println(it.nextIndex());
			System.out.println(it.next());
		}
		
		System.out.println("===========배열에 담기==========");
		it = list.listIterator();
		String[] strArr = new String[list.size()];
		while (it.hasNext()) {
			strArr[it.nextIndex()] = it.next();
		}
		System.out.println(Arrays.toString(strArr));
	}
}


값
==========다음요소반복===========
apple
kiwi
grape
banana
orange
==========이전요소반복===========
orange
banana
grape
kiwi
apple
===========================
0
apple
1
kiwi
2
grape
3
banana
4
orange
===========배열에 담기==========
[apple, kiwi, grape, banana, orange]

 

 

- 배열 얻기

package sec03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.IntFunction;

public class Sample01 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		// 이 방식으로 하지말 것
		Object[] array = list.toArray();
		System.out.println(Arrays.toString(array));
//		Object[] array2 = (String[]) list.toArray();

		// [2]
		String[] strArr = list.toArray(new String[0]);
		System.out.println(Arrays.toString(strArr));
		
		// [2]번의 방식과 다르지 않음 [2]방식으로 할것.
		String[] array2 = list.toArray(new IntFunction<String[]>() {
			@Override
			public String[] apply(int value) {
				return new String[value];
			}
		});
		System.out.println(Arrays.toString(array2));
	}
}

값
[apple, kiwi, grape, banana, orange]
[apple, kiwi, grape, banana, orange]
[apple, kiwi, grape, banana, orange]

 

 

 

- 정렬

  • 역순정렬 : Collections.reverse()
  • reverse()는 저장 순서만 뒤집음 || reverseOrder()와 다르다
  • 오름차순 : Collections.sort()
package sec03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sample02 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		// 역순정렬
		Collections.reverse(list);
		System.out.println(list);
		
		// 기본정렬 - (문자열 : 사전순), (숫자 : 오름차순)
		Collections.sort(list);
		System.out.println(list);
		
	}
}


값
[orange, banana, grape, kiwi, apple]
[apple, banana, grape, kiwi, orange]

 

 

 

- 람다식으로 정렬

package sec03;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Sample03 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("app"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana11");
		list.add("orange2222");

		// 지정된 방법으로 정렬
		// 문자열 길이 오름차순
		list.sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
		});
		System.out.println(list);
		
		// 람다식으로 
		// 문자열 길이 내림차순
		list.sort((o1, o2) -> {
			return o2.length() - o1.length();
		});
		System.out.println(list);
		
		// 문자열 길이 오름차순
		// 코드가 한줄인 경우 return과 중괄호를 생략할 수 있다.
		// return을 생략하면 중괄호를 반드시 생략해야함
		list.sort((o1, o2) -> o1.length() - o2.length());
		System.out.println(list);
		
	}
}

값
[app, kiwi, grape, banana11, orange2222]
[orange2222, banana11, grape, kiwi, app]
[app, kiwi, grape, banana11, orange2222]

 

 

 

- reverseOrder()

  • 문자열 : 사전역순, 숫자 : 내림차순
package sec03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sample04 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");

		// 역순정렬
		// reverse()와 다름 || reverse()는 저장 순서만 뒤집음
		// 문자열 : 사전역순, 숫자 : 내림차순
		list.sort(Collections.reverseOrder());
		System.out.println(list);
	}
}

값
[orange, kiwi, grape, banana, apple]

 

 

 

- 회전, 위치바꾸기, 임의로 섞기

  • 회전 : Collections.rotate()
  • 두요소 위치 바꾸기 : Collections.swap()
  • 임의로 섞기 : Collections.shuffle()
package sec03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sample05 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		System.out.println(list);
		
		// 리스트 회전 (양수 : 오른쪽 || 음수 : 왼쪽)
		Collections.rotate(list, 2);
		System.out.println(list);
		
		Collections.rotate(list, -1);
		System.out.println(list);
		
		// 두 요소의 위치바꾸기
		Collections.swap(list, 1, 4);
		System.out.println(list);
		
		// 임의로 순서 섞어줌
		Collections.shuffle(list);
		System.out.println(list);
	}
}

값
[apple, kiwi, grape, banana, orange]

[banana, orange, apple, kiwi, grape]

[orange, apple, kiwi, grape, banana]

[orange, banana, kiwi, grape, apple]

[orange, grape, kiwi, banana, apple]

 

 

 

- 최대값, 최소값

  • 최대값 : Collections.max()
  • 최소값 : Collections.min()
  • 문자열은 사전순서
package sec03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Sample06 {
	public static void main(String[] args) {
		List<Integer> intList = new ArrayList<Integer>();
		intList.add(10);
		intList.add(13);
		intList.add(9);
		intList.add(15);
		intList.add(11);

		// 최대값
		int max = Collections.max(intList);
		
		// 최소값
		int min = Collections.min(intList);
		
		System.out.println(max);
		System.out.println(min);
		
		
		List<String> list = new ArrayList<String>();
		list.add("apple"); 
		list.add("kiwi"); 
		list.add("grape"); 
		list.add("banana");
		list.add("orange");
		
		// 문자열 최대값, 최소값은 사전순서
		System.out.println(Collections.max(list));
		System.out.println(Collections.min(list));
		
	}
}

값
15
9
orange
apple

 

반응형

'학습 > JAVA' 카테고리의 다른 글

11. 기본 API 클래스(3)  (0) 2022.10.31
11. 기본 API 클래스(2)  (0) 2022.10.27
11. 기본 API 클래스(1)  (0) 2022.10.26
10. 예외처리  (0) 2022.10.25
9. 중첩 클래스와 중첩 인터페이스  (0) 2022.10.24

댓글