자바 컬렉션 프레임워크와 List

MIN·2023년 11월 14일

Java

목록 보기
23/36
post-thumbnail

학원 수업내용 복습

🥨 자바 컬렉션 프레임워크

많은 데이터를 저장하고 처리하기 위한 프로그램을 만들 때
기본형식으로 배열을 사용할 수 있다.
하지만 배열을 사용하면 정렬 및 기타 기능을 사용할 때 값을 꺼내고 삭제하기가 복잡하여 관리상의 불편함이 생길 수 있다.

때문에 다양한 자료구조(Data Struct)를 이용하여 관리하게 되는데 자바에서 기본 제공하는 형식이 있어서 이를 활용하면 편리하게 작업할 수 있다!

바로
대표적으로 List, Set, Map이 있다

🥨 리스트(List)

리스트는 선형자료구조로, 일직선으로 이루어진 구조에 데이터를 저장한다.
순서가 있으며, 값의 중복을 허용한다.

리스트를 구현하고 있는 java.util.List 클래스는 인터페이스라서 객체를 생성할 수 없다. 따라서 List를 implement하는 다른 클래스를 사용한다.
대표적으로는 ArrayList 가 있다.

ArrayList list = new ArrayList();
이렇게 처음으로 리스트를 생성했을 때 길이를 확인하면 0으로 나온다. 이 뒤로 값을 추가하거나 삭제하면 자동으로 길이가 변경된다.
참고로 리스트를 포함한 컬렉션들은 대부분 toString이 오버라이딩 되어있어 list 객체를 그대로 출력해도 값을 바로 확인 할 수 있다.

💡 size( )

리스트의 길이를 확인하는 함수는 size( )이다.
list.size( )는 리스트의 길이를 반환한다.

💡 add( )

리스트의 값을 추가하는 함수는 add( )이다.
list.add( )는 리스트의 가장 마지막에 요소를 추가한다.

(return type은 boolean이다.
반환된 내용이 true면 list에 요소가 잘 담겼다는 뜻이다.)

add( index, E e )
위 함수는 list의 특정 인덱스에 값을 집어넣을 수 있다.
그 인덱스의 값은 지워지는 것이 아니라 한칸씩 뒤로 밀려난다.
즉, 덮어쓰기가 아니다!

💡 remove( )

리스트의 값을 삭제하는 함수는 remove( )이다.
list.remove( ) 안에 삭제하고 싶은 값을 그대로 집어넣으면 해당 값에 해당하는 요소를 삭제하지만
해당 값이 정수면 index값으로 인식하여 엉뚱한 값이 삭제될 수 있다.
다시말해, remove( )안에 정수입력은 리스트의 특정 인덱스의 값을 삭제할 때 사용한다.

ex) list.remove( 10 )
값이 '10'인 요소를 삭제하는 것이 아닌
리스트의 인덱스가 10번째인 값을 삭제한다.
( 이럴때에는 list.remove(Integer.valueOf( 10 ))을 사용하면 좋다 )

add와 마찬가지로 삭제된 곳은 null로 존재하는 것이 아니라 뒤의 값들이 한칸씩 앞으로 이동하게 된다.

💡 get( index )

리스트의 특정 인덱스의 값을 가져올 때 사용한다.

ex) list.get(0)
리스트의 0번째 인덱스의 값을 반환한다.

💡 list.set( index, E e )

지정한 위치의 값을 바꿀 때 사용한다.

ex) list.set(0,60)
0번째 값을 60으로 바꾸어라

💡 clear( )

list.clear를 사용하면 리스트의 모든 값을 한번에 비울 수 있다.

💡 isEmpty()

리스트가 주어졌을때 비어있는 리스트인지 아닌지 확인할 때 유용하다.
boolean값을 반환한다.

💡 contains( )

리스트 내부에 특정 값이 포함되어 있는지 판별하는 함수다.
booelan값을 반환한다.

ex) list.contains("LOVE")
리스트 내에 LOVE 라는 글자가 포함되어있는지 확인한다.


🥨 리스트 정렬하기

내장되어있는 정렬함수를 이용하거나 다른 클래스를 이용하여 정렬할 수 있다.

💡 첫번째 정렬방법

list.sort( null );
System.out.println( list );

null 자리에는 정렬 기준을 나타내기 위한 객체를 전달할 수 있다
null로 설정되면 기본값인 오름차순으로 정렬이 된다.

※ Comparable은 Integer, Double, String 등의 인터페이스를 구현하고 있다. 따라서 위 자료형은 배열 및 리스트에서 sort 함수를 이용해 기본값으로도 정렬이 가능하다.

↑ 예시) Integer 클래스에 implements된 Comparable

💡 두번째 정렬방법

위에 적었듯이 Comparable 덕분에 Integer, Double, String은 큰 힘을 들이지 않고 정렬이 가능하다.
하지만 위 자료형이 아닌 다른 자료형들은 sort를 사용해 정렬이 불가능하다.
따라서 이때에는 Comparator 인터페이스를 통해 직접 정렬을 구현해주어야 한다!


Book 클래스가 존재할 때 내부의 필드는 String name (도서명), int price (도서 가격)가 있다고 쳐보자.
그리고 이 Book객체들을 담은 list가 있을 때 이 리스트를 이름순으로 정렬하고 싶을 때 코드를 구현해보자!!

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

class Book {
	String name;
	int price;
	
	public Book(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	@Override
	public String toString() {	// toString 오버라이딩 해줘야 바로 리스트 출력 가능
		return String.format("%s : %,d", name, price);
	}
}

public class Ex03 {
	public static void main(String[] args) {
		ArrayList<Book> list = new ArrayList<>();
		Book b1 = new Book("자바의 정석", 25000);
		Book b2 = new Book("스프링 부수기", 26000);
		Book b3 = new Book("서블릿 기초", 18000);
		Book b4 = new Book("파이썬 입문코딩", 30000);
		
		list.add(b1);
		list.add(b2);
		list.add(b3);
		list.add(b4);
		
		// 인터페이스 Comparator 를 객체화하기 위해 내부에서 직접 추상메서드 구현
		Comparator<Book> comp = new Comparator<>() {
			@Override
			public int compare(Book o1, Book o2) {
				return o1.name.compareTo(o2.name);
			};	// 이름 오름차순으로 정렬
		};
		list.sort(comp);
		list.forEach(c -> System.out.println(c));
	}

}

🥨 리스트의 자료형

list는 특별히 자료형을 지정하지 않으면, 내부에 Object를 저장하기 때문에 모든 유형의 객체를 저장할 수 있다.
(제네릭 타입 지정X)

ArrayList list = new ArrayList();

list.add(10);
list.add(20);
list.add("ITBANK");
list.add(3.14);
System.out.println(list);

출력
[ 10, 20, ITBANK, 3.14 ]

반대로 리스트에 한 가지의 자료형만을 넣고 싶다면 제네릭 타입
지정해주면 된다.

ArrayList<Book> list2 = new ArrayList<>( );
(Book타입의 자료형만 집어넣을 수 있는 리스트)

참고로 제네릭 타입으로 primitive type을 넣을 수 없다.
오직 Reference type만 넣을 수 있다.

profile
기초부터 시작하는 감쟈 ※ 소개글 확인해주세요!! ※

0개의 댓글