Backend Basic/Java

Java : ArrayList 다루기

마이트너 2023. 5. 23. 13:20

오늘의 TIL 주제

오늘 공부하다가 막혔던 부분 2가지를 연결해서 단계별로 정리해보려 한다 !

① ArrayList에 저장된 객체 정렬

② ArrayList에 임의의 크기로 여러 개의 객체 저장

 

오늘의 회고

계속 같은 방법으로 어떻게든 해보려고 매달리다가

"또다른 방법은 없을까?"

"굳이 이 방법으로 해야하는 문제일까?"

그렇게 고민해보니 복잡했던 문제가 갑자기 쉬워지는 경험을 했다.

 

어떻게든 ArrayList의 정렬과 출력을 동시에 하려다 어려워

sort 메서드를 println 메서드에서 분리하면서 해결된 것처럼

 

지금 하는 방법으로 복잡할 땐 하던 코드를 덮어놓고

"결국 내가 구현하고 싶은 기능 등의 결과물이 무엇인지"

를 확인하는 것이 중요하다는 생각을 하게 되었다.

 

이러한 방법을 연습하기 위해

평소에 코딩을 할 때, 이미 원하는 것이 구현되었더라도

여러 방법으로 다시 구현해보는 연습을 하면 도움이 될 것 같다.

 

 


STEP 01. ArrayList 정렬하는 방법 알아보기

✅ 방법론 : 생각해보기

List 인터페이스, ArrayList 구현클래스에서 제공하는 메서드들은 매개변수로 Comparator를 갖는다 (아래 코드 참조).

이 방법은 다음에 해보도록 하고,
이번엔 바로 List 값을 반환하는 메서드 활용하는 방법을 해보려 한다.

 

EX. java.util 패키지 : Collections 클래스 List 인터페이스
//java.util.Interface List 
void sort​(Comparator<? super E> c)​

 

구글링 및 Java API문서를 살펴보니 Collections 클래스에 있다 (아래 코드 참조).
만약 없었으면 오버라이딩해서 새로 재정의하면 될 것 같다.

 

EX. java.util 패키지 : Collections 클래스
 
➡️ Collections 클래스가 제공하는 메서드 (java version 11.0.18 기준)
//java.util.Collections 
void sort​(List<T> list)

STEP 02. 실제로 ArrayList 정렬 코드 짜보기

 코딩해보기 : 문제 상황 발생

 

※ 에러 발생 (java: 'void' type not allowed here)
바로 출력하려고 했더니, sort() 메서드의 반환 타입인 void가 println() 메서드의 매개변수로 쓰일 수 없다고 한다.

 

 

 코딩해보기 : 문제를 해결한 방법

그래서 일단 String 타입의 데이터와 분리를 한 후

print(), println() 메서드가 가질 수 있는 매개변수의 종류를 살펴봤다.

 

정의된 println 메서드에서는 void 타입을 바로 쓰는 건 불가능하다는 것을 확인

 

 

반환되는 데이터 타입을 변환하는 것보다는

ArrayList의 출력과 정렬을 분리하는 게 쉽겠다.

 

해결 완료!


STEP 02. ArrayList 임의의 크기로 여러 개 저장해보기

 코딩해보기 : 응용해보기  코딩해보기 : 문제 상황 발생

 

코딩해보기 : 문제를 해결한 방법

Before. 캐스팅 문제 발생

package Week02.ArrayList;

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

/*ArrayList (순서있고 중복허용하는 데이터 집합)*/
public class ArrayList_basic {
    public static void main(String[] args) {

//      1) list 인터페이스의 구현클래스인 ArrayList 컬렉션 선언 및 생성
//      '모든 타입 클래스의 객체 10개'를 list1 컬렉션에 담을 수 있는 상태
        ArrayList list1 = new ArrayList(10);

//      ----------------------------------------------------------------

//      2) list1 컬렉션에 값(객체) 추가하기 (크기 자동 조정)
        list1.add(5); //list1.add(new Integer(5));
        list1.add(15);
        list1.add(3);

//      컬렉션의 요소들을 하나씩 출력하는 방법
        System.out.println("list1.get(0) = " + list1.get(0));
        System.out.println("list1.get(1) = " + list1.get(1));
        System.out.println("list1.get(2) = " + list1.get(2));
        System.out.println();

//      컬렉션 전체를 한번에 출력하는 방법
        System.out.println("list1 = " + list1);
        System.out.println("------------------------------");

//      컬렉션의 크기(요소(객체)의 개수)
        System.out.println("list1의 크기 : " + list1.size()); //컬렉션은 크기가 자동 조정되기 때문에 현재의 크기는 3
        System.out.println("------------------------------");

//      컬렉션의 요소들을 정렬하는 방법
        System.out.println("list1 정렬하기 전 : " + list1);
        Collections.sort(list1);
        System.out.println("list1 정렬한 후 : " + list1);
        System.out.println("------------------------------");

//      컬렉션에 임의의 크기만큼 임의의 객체 삽입해보기
        System.out.println("list1에 임의의 크기만큼 임의의 객체 삽입하기 전 : " + list1);

        System.out.println(Math.round(Math.random()*10));
        for(int i=0; i<Math.round(Math.random()*10); i++){
            list1.add(i, Math.round(Math.random()*10));
//        }
        Collections.sort(list1);
        System.out.println("list1에 임의의 크기만큼 임의의 객체 삽입한 후 : " + list1);
    }
}

 

 

After. 해결 완료!

변경한 내용

① int 타입으로 캐스팅
for(int i=0; i<Math.round(Math.random()*10+1); i++){
	list1.add(i, (int) Math.round(Math.random()*10));
}​

② for 문의 매개변수 i의 범위에 +1을 했는데, 앞서 발생한 문제와는 무관하지만 ArrayList의 요소가 최소한 1개는 있었으면 해서 변경하였다. 
for(int i=0; i<Math.round(Math.random()*10+1); i++){​
추가한 내용
: 기왕 난수를 마구마구 랜덤으로 저장해보는 김에 범위를 달리하여 경우를 추가해봤다.

① 기존의 1~10 사이의 난수를 넣는 경우
② 추가로 1~100 사이의 난수를 넣는 경우
package Week02.ArrayList;

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

/*ArrayList (순서있고 중복허용하는 데이터 집합)*/
public class ArrayList_sort {
    public static void main(String[] args) {

//      1) list 인터페이스의 구현클래스인 ArrayList 컬렉션 선언 및 생성
//      '모든 타입 클래스의 객체 10개'를 list1 컬렉션에 담을 수 있는 상태
        ArrayList list1 = new ArrayList(10);

//      ----------------------------------------------------------------

//      2) list1 컬렉션에 값(객체) 추가하기 (크기 자동 조정)
        list1.add(5); //list1.add(new Integer(5));
        list1.add(15);
        list1.add(3);

//      컬렉션의 요소들을 하나씩 출력하는 방법
        System.out.println("list1.get(0) = " + list1.get(0));
        System.out.println("list1.get(1) = " + list1.get(1));
        System.out.println("list1.get(2) = " + list1.get(2));
        System.out.println();

//      컬렉션 전체를 한번에 출력하는 방법
        System.out.println("list1 = " + list1);
        System.out.println("------------------------------");

//      컬렉션의 크기(요소(객체)의 개수)
        System.out.println("list1의 크기 : " + list1.size()); //컬렉션은 크기가 자동 조정되기 때문에 현재의 크기는 3
        System.out.println("------------------------------");

//      컬렉션의 요소들을 정렬하는 방법
        System.out.println("list1 정렬하기 전 : " + list1);
        Collections.sort(list1);
        System.out.println("list1 정렬한 후 : " + list1);
        System.out.println("------------------------------");

//      컬렉션에 임의의 크기만큼 임의의 객체 삽입해보기
        System.out.println("list1에 임의의 크기만큼 임의의 객체 삽입하기 전 : " + list1);

        for(int i=0; i<Math.round(Math.random()*10+1); i++){
            list1.add(i, (int) Math.round(Math.random()*10));
        }
        Collections.sort(list1);

        System.out.println("list1에 임의의 크기(1~10)만큼 임의의 객체 삽입한 후 : " + list1);

        for(int i=0; i<Math.round(Math.random()*100+1); i++){
            list1.add(i, (int) Math.round(Math.random()*100));
        }
        Collections.sort(list1);

        System.out.println("list1에 임의의 크기(1~100)만큼 임의의 객체 삽입한 후 : " + list1);
    }
}

✅ 관련 배경이론 습득 : 오늘 공부한 이론 요점정리

 

① 오늘 공부 한 "Collections 클래스" 요점정리한 노션 페이지

자바의 클래스 中, Collections 클래스 추가 (https://lapis-holly-92a.notion.site/a0a1f72cf94b4703b76f2a3d3da84c00)

 

자바의 클래스

자바(Java)의 API(Aapplication Programming Interface)가 제공하는 클래스들

lapis-holly-92a.notion.site

 

② 오늘 공부 한 "컬렉션 프레임워크" 요점정리한 노션 페이지

컬렉션 프레임워크 추가 (https://lapis-holly-92a.notion.site/b4278fdf2561418a9251f8e7aab111b5)

 

컬렉션 프레임워크

“컬렉션 : 여러 개의 객체(데이터의 집합)를 모아둔 것”

lapis-holly-92a.notion.site

 

✅ 참고한 자료모음

[Java API 문서] Overview (Java SE 11 & JDK 11 ) (oracle.com)

 

Overview (Java SE 11 & JDK 11 )

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

[서적] 자바의 정석 일반 3판

 

728x90

'Backend Basic > Java' 카테고리의 다른 글

자바 클래스 모음집 : Scanner  (0) 2024.11.26
Java : Keywords 노려보기  (0) 2023.06.13