본문 바로가기
Java/Java Basic

[Java Basic] 38 - 컬렉션 프레임워크8 (java.util.Collections)

by Rosmary 2022. 9. 7.
728x90
반응형

 

 

 

컬렉션 프레임워크의 마지막 포스팅이다. 이번 포스팅에서는 Collections 클래스에 대해 알아보려한다. 

 

배열을 쉽게 다루기 위해 java.util 패키지에 Arrays 클래스가 정의되어 있는 것처럼, 컬렉션 프레임워크 역시 소속된 클래스를 조금 더 효율적으로 제어하기 위한 Collections 클래스가 정의되어 있다. 하지만 Arrays가 대부분 매서드 영역에서 기능만을 제어하는 것과 달리, Collections는 컬렉션 단위에서의 기능을 제어할 수 있는 매서드를 제공한다. 컬렉션 프레임워크에 해당하는 클래스가 한 종류의 객체만 저장할 수 있도록 만드는 Collection 타입으로 변환하는 매서드 혹은 멀티스레드(Multi-Thread)에 활용할 수 있도록 Collection에 동기화가 적용된 Collection 타입으로 변환하는 매서드 등이 예시다.

 

기능 매서드에 대해 간략하게 살펴본 뒤, Collection 특성을 변경하는 매서드들에 대해 알아보려한다.

 

 

1. Collections의 기본 매서드

 

기본 매서드 대부분은 컬렉션 프레임워크에서 대부분 다루어보았던 내용들이 대다수다. List의 요소를 모두 하나의 값으로 채우는 것, 역순 배열, 복사 등등등이 여기에 속한다.

 

 

 

Collections.copy(새 List, 복사할 List) 매서드도 존재한다. 복사할 List를 새 List로 '복사'하는 기능을 가지는데, 사실 List를 매개로 새 List 인스턴스 생성이 가능하기 때문에 잘 사용되지 않는다. 더구나 copy() 매서드는 새 List의 저장 요소 수가 반드시 복사할 List 저장된 요소 수보다 크거나 같아야 한다는 조건이 있어야 사용이 가능한데, 실제로 사용해보면 이 조건을 맞춰서 사용하는 것이 쉽지가 않다.

 

 

 

위의 예시가 Collections.copy()의 사용 예시다. 32번 Line부터 코드를 보면 복사를 통해 새로 생성할 List는 반드시 복사할 List의 size()보다 크거나 같은 크기의 요소를 가지고 있어야 한다. 필자의 경우 23번째 줄에 tmpArrList에 nCopies() 매서드를 사용하여 0값을 arrList.size()와 동일한 수 만큼 추가하여 새 LIst를 생성했지만, nCopies()로 생성된 List는 변경이 불가능하다는 특성(Immutable)으로 인해 복사 시 UnsupportedOperationException이 발생한다.  

 

 

 

배열에서는 서로 다른 Index에 저장된 값의 위치를 바꾸기 위해 별도의 변수를 선언해주어야 했으나, Collections는 List 내 저장된 두 값의 위치를 바꿀 수 있는 swap()이라는 매서드를 제공한다. 

 

이외에도 fill(), replaceAll() 등 Arrays에서 제공하는 일부 매서드 역시 동일하게 사용이 가능하다. 이 내용은 굳이 필자가 예시를 들지 않더라도 사용할 수 있는 부분이라 넘어간다.

 

 

 

2. 변경이 불가능한 컬렉션 프레임워크 생성

 

컬렉션 프레임워크는 값의 추가, 삭제, 수정을 매서드를 호출하여 진행한다. 하지만 프로그래밍을 진행하다보면 민감한 정보거나 무결성이 중요한 정보인 경우 컬렉션 프레임워크의 저장값이 변경되지 않도록 만들어야 하는 경우가 있다. 이 때 사용되는 Collections의 매서드는 unmodifiable, "변경 불가"라는 이름으로 시작하는 매서드다.

 

 

 

Map으로 위에서 생성한 Properties.xml 파일을 입력받고 이 정보가 변경되지 않도록 만들어보자. 

 

 

 

unmodifiable() 매서드는 매개 인자로 들어온 Collection을 Immutable하게 만들어 반환한다. 따라서 매개 인자로 선언된 객체와 동일한 객체 변수로 저장이 되어야한다. 매개변수로 입력된 Collection이 변경 불가로 전환되는 것이 아니라는 점에 유의해야 한다.

 

 

 

 

3. 단일 종류의 객체만 저장하는 컬렉션 프레임워크 생성

 

컬렉션 프레임워크에 속하는 클래스들은 요소들의 자료형 및 객체 타입에 상관없이 모두 혼합 저장이 가능하다. 극단적으로 정수형 자료형과 클래스 타입의 객체가 하나의 컬렉션에 들어가는 것도 가능하다. 하지만 이렇게 단일화되지 않은 여러 타입의 데이터가 컬렉션 내에 저장되는 것도 추후 데이터를 다루기 어려워지는 원인이 된다. 가령, 모든 사람의 통장 예금 금액을 하나의 컬렉션에 저장하는데 어떤 자료는 기본 정수형이고, 어떤 자료는 Interger 형태고, 어떤 형태는 String이라면 추후 데이터를 다룸에 있어 문제가 발생할 수 밖에 없다.

 

이 때문에 Collections는 각 컬렉션에 저장되어야 하는 객체 타입을 지정하는 매서드를 제공한다. 매서드 이름은 checked로 시작한다.

 

 

 

방금 생성한 Map에 checkedMap() 매서드를 적용해보자.

 

 

 

입력해야하는 자료형이 명시되었기 때문에 이 외의 자료형이 입력되면 입력된 자료형을 명시된 자료형으로 변경하려는 시도(형변환)를 한다. 위의 예시에서는 int를 String으로 변환할 수 없기 때문에 ClassCastException이 발생한 것이다.

 

 

 

4. 동기화(Synchronized) 컬렉션 및 singleton 컬렉션 생성

 

생성한 컬렉션에 동기화 기능을 적용하는 경우 synchronized로 시작하는 이름의 메서드를 적용하면 된다. 이 매서드를 사용하기 위해서는 Thread의 개념을 먼저 이해해야한다. Thread는 필자도 정보가 없어 동기화 컬렉션에 대한 내용은 Thread 포스팅을 진행하면서 같이 다루려 한다.

 

 

 

Collections 클래스는 singleton으로 시작하는 매서드도 제공한다. 앞서 보았던 매서드들과 달리 종류는 singleton(), singletonList(), singletonMap() 세 가지만 존재하는데, 매개인자로는 각 Collection에 입력할 요소(Element)나 Entry 값을 입력한다. 입력된 매개변수를 참조하여 컬렉션을 생성하는데, 이 컬렉션들은 변경 불가한 특성을 가진다.

 

 

 

사용 예시는 아래와 같은데, 솔직히 어디에 사용해야 할 지는 필자가 감이 안온다. 

 

 

 

 


 

 

길고 길었던 컬렉션 프레임워크 포스팅을 마무리한다. 다음 포스팅부터는 Generics라는 개념에 대해 알아보려한다. 

 

 

 

Fin.

 

 

반응형

댓글