JAVA : 컬렉션 프레임워크(List, Set, Map), 람다식, 메소드 참조

soap·2025년 4월 11일

Java : 기초

목록 보기
9/11

🍋 컬렉션 프레임워크

  • List와 Set은 Collection 인터페이스를 구현

List

✅ 순서 있음 ==> .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

Set

◾ 순서 없음
◾ 중복허용 안 함
◾ add()

🚫 Set은 List의 하위 클래스이고 List는 자식 클래스의 재정의된 메소드 사용이 가능하기 때문에 (List가 가지고 있는 메소드를 재정의 한것이기 때문에) 다양하게 사용가능하다.

Map

◾ key - value 값으로 저장
◾ key 값은 겹치면 안됨
◾ put() , get()

https://developer-talk.tistory.com/745

향상된 for문

iterator ()

컬렉션(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(): voidnext()로 가져온 객체를 Set컬렉션에서 제거한다

객체를 가져오거나 제거 하는 방법

  1. 객체가 존재하는지 확인
  2. next()로 하나의 객체 가져오기
while(iterator.hasNext()){
	E e = iterator.next();
    //iterator.remove();
}

Comparable, Comparator

모두 인터페이스 이기때문에 사용하고자 한다면 인터페이스 내에 선언된 메소드를 반드시구현 해야 한다

[Comparable]

구현해야할 메소드는 compareTo(T o)

[Comparator]

구현해야할 메소드가 많지만 실질적으로 구현해야 하는 것은 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

LIFO , FIFO

LIFO : 스택(stack)

Stack<E> stack = new Stack<>();

push(E item): E
pop() : E // 맨위 객체를 빼기

FIFO : 큐(Queue)

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

profile
치열하게 살지는 않아도 후회되는 순간은 만들지 말자

0개의 댓글