
✅ 순서 있음 ==> .get(i) 사용하여 인덱스로 접근가능
✅ 중복허용
❓ 배열이랑 가장 유사한데 List를 사용하는 이유는?
: 배열은 크기를 선언하면 바꾸지 못함 => 객체 새로 생성해야한다.
리스트는 동적 크기 추가가 용이 => add()로 끝나버림
추가, 삭제 , 정렬, 검색 가능하다는 점이 장점이다.
//1차원
List<String> list = new ArrayList<>();
list.add("");
//2차원
List<List<Integer>> = new ArrayList<>();
list.add(new ArrayList<>(...));
//배열
List<int[]> list = new ArrayList<>();
list.add(new int[]{});
//추가 add() 삭제 remove() 안됨
List<String> list = Arrays.asList("a", "b", "c");
1) 객체 추가
add(E e) : 객체 맨끝 추가
add(int index, E e) : 객체를 해당 인덱스에 추가
2) 객체 조회
get(int index) : E
containes(Object o) : boolean 주어진 객체가 있는지 없는지 여부
size() : int 전체 객체수 리턴
3) 객체 삭제
remove(int index) 인덱스에 저장된 객체를 삭제
1-1) 기본 리스트 출력
📌 System.out.print(ln)
💭 내부적으로 재정의한 toString() 호출됨
//추가 삭제 예시를 드는게 아니라서 asList 씀
List<String> list = Arrays.asList("a","b","c");
System.out.print(list); // [a,b,c]
📌 for
💭 주로 한줄씩 출력하고 싶을 때
for(String string : list) {
System.out.println(string);
}
//a
//b
//c
📌 forEach
forEach(Consumer<? super String>)

: Consumer<? super String> -> String을 포함한 상위 타입 모두 허용
✅ Consumer 란?
입력값은 받고, 반환값은 없는 함수를 표현할 때 쓰는 인터페이스
@FunctionalInterface
public interface Consumer {
void accept(T t);
}
? 꼭 forEach 쓸대 람다식을 써야하나? 노노
내가 했던...
list.forEach(System.out.print(list));
이건 함수의 호출 결과를 넣으려는 것이기 때문에 메서드 참조형태를 넣어야한다.
forEach(함수) 여야하는데
System.out.print -> void
즉. forEach(void)이기때문에 안됨.

list.forEach(System.out::print);
list.forEach((item) -> System.outprin(item))
📌 for
1-2) 2차원
2) 반복문 이용하여 출력하기
3) .forEach 사용하기
4) stream
◾ 순서 없음
◾ 중복허용 안 함
◾ add()
🚫 Set은 List의 하위 클래스이고 List는 자식 클래스의 재정의된 메소드 사용이 가능하기 때문에 (List가 가지고 있는 메소드를 재정의 한것이기 때문에) 다양하게 사용가능하다.
◾ key - value 값으로 저장
◾ key 값은 겹치면 안됨
◾ put() , get()
https://developer-talk.tistory.com/745
컬렉션(List, Map, Set)을 순회할 수 있게 해주는 반복자 객체
즉, for문 while문 없이도 탐색 가능하게 함
🔥 iterator을 사용하는 이유는 반복 도중에 삭제(remove) 가능하다
List<E> list = new Set<>();
list.iterator 사용이 가능하다.
Set<E> set = new HashSet<>();
Iterator iter = set.Iterator();
| 메소드명 | 설명 |
|---|---|
| hasNext() : boolean | 객체가 있으면 true, 없으면 false |
| next() : E | 하나의 객체를 가져온다 |
| remove(): void | next()로 가져온 객체를 Set컬렉션에서 제거한다 |
while(iterator.hasNext()){
E e = iterator.next();
//iterator.remove();
}
모두 인터페이스 이기때문에 사용하고자 한다면 인터페이스 내에 선언된 메소드를 반드시구현 해야 한다
구현해야할 메소드는 compareTo(T o)

구현해야할 메소드가 많지만 실질적으로 구현해야 하는 것은 comparator(T o1, T o2)
https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary
https://st-lab.tistory.com/243
Stack<E> stack = new Stack<>();
push(E item): E
pop() : E // 맨위 객체를 빼기
Queue<E> queue = new LinkedList<E>();
offer(E e): boolean
poll() : E
(매개변수) -> {실행문}
추상메서드가 하나인 인터페이스만 가능
실행문 하나 일때 중괄호 생략
실행문이 return 하나일때 생략
매개변수가 하나일때 괄호 생략
✅ 메서드 참조 (::)
🎯 문법:
클래스이름::메서드이름
객체이름::메서드이름
예시들:
✔ 정적 메서드 참조
Function<String, Integer> parse = Integer::parseInt;
// 원래는: (s) -> Integer.parseInt(s)
✔ 인스턴스 메서드 참조 (특정 객체)
List<String> names = Arrays.asList("A", "B", "C");
names.forEach(System.out::println);
// 원래는: (s) -> System.out.println(s)
✔ 인스턴스 메서드 참조 (임의 객체)
List<String> names = Arrays.asList("Kim", "Lee", "Park");
names.sort(String::compareToIgnoreCase);
// 원래는: (a, b) -> a.compareToIgnoreCase(b)
✅ 생성자 참조
🎯 문법:
클래스이름::new
예시:
✔ 기본 생성자
Supplier<List> supplier = ArrayList::new;
// 원래는: () -> new ArrayList<>()
✔ 매개변수 있는 생성자
Function<String, Person> creator = Person::new;
// 원래는: (name) -> new Person(name)
✅ 요약표 📌
유형 람다식 메서드/생성자 참조
정적 메서드 (x) -> Class.method(x) Class::method
인스턴스 메서드 (특정 객체) (x) -> obj.method(x) obj::method
인스턴스 메서드 (임의 객체) (x, y) -> x.method(y) Class::method
생성자 () -> new Class() Class::new