Skip to main content

Command Palette

Search for a command to run...

[ Java ] 순회, 정렬, 컬렉션 유틸

Updated
•3 min read•View as Markdown
[ Java ] 순회, 정렬, 컬렉션 유틸
S

Nice to meet u :) Im Backend Developer

1️⃣ Iterable, Iterator

데이터를 차례대로 접근해서 처리하는 것

다양한 자료구조가 있고 각 자료 구조마다 데이터 접근 방법 다름.

자료구조를 동일한 방법으로 순회하기 위해 Iterable, Iterator 제공.

public interface Iterable<T> {
    Iterator<T> iterator();//반복자 반환
}
public interface Iterator<E> {
    boolean hasNext(); //다음 요소 존재 확인
    E next(); // 다음 요소 반환
}

Iterable을 구현하면 Iterator을 반환하기 때문에 Iterable 단독 사용x

자바 컬렉션 상위에 Iterable이 있어 모든 컬렉션을 순회할 수 있도록 하였다.

각 자료구조마다 iterator을 구현하며 이를 반환한다. 따라서 각 자료구조가 Iterable 역할을 한다.


2️⃣ Comparable, Comparator

👉🏻 Comparator

public interface Comparator<T> {
     int compare(T o1, T o2);
}
  1. compare은 o1이 크면 -1, 같으면 0 , 작으면 1을 반환한다.

  2. 만약 정렬기준을 설정하고 싶을때 사용한다.

public static void main(String[] args){
        Integer[] arr = {3, 2, 1};
        Arrays.sort(arr,new AscComparator());//123
        Arrays.sort(arr,new DescComparator());//321
    }

    static class AscComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer o1, Integer o2) {
            return (o1<02)?-1: ((o1 == o2) ? 0 : 1);
        }
    }
    static class DescComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer o1, Integer o2) {
            return ((o1<02)?-1: ((o1 == o2) ? 0 : 1))*-1;
        }
    }

정렬을 사용할때 Arrays.sort를 사용하는데 코드를 살펴보면 Comparator을 파라미터로 입력받는 것을 확인할 수 있다.

public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

👉🏻 Comparable

내가 정의한 객체를 정렬하려면 어떤 객체가 더 큰지 알려줘야한다.

public class MyUser implements Comparable<MyUser> {
    private String id;
    private int age;

    public MyUser(String id, int age) {
        this.id = id;
        this.age = age;
    }

    public String getId() {
        return id;
    }
    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(MyUser o) {
        return this.age<o.age?-1: (this.age == o.age ? 0 : 1);
    }
}

정렬 기준을 나이로 정했다. Arrays.sort(array)하면 오름차순으로 정렬되어 나타난다.

Arrays.sort(array,comparator)로 정렬방식을 지정하면 객체가 가지고 있는 Comparable(기본 정렬)을 무시하고 전달받은 기준으로 정렬한다.

트리 구조는 정렬해서 보관하기 때문에 정렬 기준을 꼭 제공해야한다.

TreeSet<MyUser> treeSet1= new TreeSet<>();//나이 기준 정렬
TreeSet<MyUser> treeSet2= new TreeSet<>(new IdComparator());//id기준 정렬

3️⃣ 컬렉션 유틸

max, min, shuffle. sort, reverse 등 다양한 기능을 제공한다.

그중, XXX.of()는 컬렉션을 편리하게 생성할 수 있지만 불변이다. List, Set, Map모두 지원한다.

public static void main(String[] args){
        List<Integer> list = List.of(1, 2, 3);
        ArrayList<Integer> mutableList = new ArrayList<>(list);
        mutableList.add(4);
        List<Integer> unmodifiableList=Collections.unmodifiableList(mutableList);
    }

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                  implements List<E> {
        @java.io.Serial
        private static final long serialVersionUID = -283967356065247728L;

        @SuppressWarnings("serial") // Conditionally serializable
        final List<? extends E> list;

        UnmodifiableList(List<? extends E> list) {
            super(list);
            this.list = list;
        }

불변 리스트→ 가변 리스트 : new ArrayList를 사용한다.

가변 리스트→ 불변 리스트 : Collections.unmodifiableList()가 파라미터 리스트를 UnmodifiableList로 바꿔 return한다. UnmodifiableList는 final로 List가 불변이 되도록 한다.

cf) Arrays.asList() : 고정된 크기를 가지지만 요소들은 변경 가능

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts