728x90
컬렉션 프레임워크란?
- 흔히 프로그램 개발을 건물 짓는 일에 비유합니다.
- 원하는 건물을 지으려면 구조를 잘 잡아야 하듯이 프로그램을 개발할 때도 사용하는 자료를 어떤 구조로 관리할 것인지가 중요합니다.
- 그래야 프로그램의 기능을 효과적으로 구현할 수 있기 때문입니다.
- 이 때 사용하는 것이 자료 구조(data structure)입니다.
- 자료 구조는 프로그램 실행 중 메모리에 자료를 유지 및 관리하기 위해 사용합니다.
- 자바에서는 필요한 자료 구조를 미리 구현하여 java.util 패키지에서 제공하고 있는데, 이를 컬렉션 프레임워크 collection framework 라고 합니다.

- 자료 구조는 개발자가 필요할 때 직접 만들어 사용할 수도 있습니다.
- 하지만 자바 컬렉션 프레임워크를 사용하면 직접 개발하는 수고를 덜 수 있을 뿐만 아니라 잘 만들어진 자료 구조 클래스를 활용할 수 있습니다.
- 여기에서는 자료 구조 자체에 대해 자세히 다루지는 않습니다.
- 앞으로 이야기할 내용은 자바에서 제공하는 자료 구조 라이브러리입니다.
- 자바가 라이브러리를 어떻게 제공하는지, 또 그 라이브러리를 어떻게 사용할 수 있는지 살펴볼 것입니다.
- 자바 컬렉션 프레임워크에는 여러 인터페이스가 정의되어 있고, 그 인터페이스를 구현한 클래스가 있습니다.
- 각 인터페이스의 특성과 클래스 활용법을 알면 개발 목적에 맞게 잘 활용할 수 있습니다.

- 컬렉션 프레임워크의 전체 구조는 Collection 인터페이스와 Map 인터페이스 기반으로 이루어져 있습니다.
- Collection 인터페이스는 하나의 자료를 모아서 관리하는 데 필요한 기능을 제공합니다.
- Map 인터페이스는 쌍 pair 으로 된 자료들을 관리하는 데 유용한 기능을 제공합니다.
- 각 인터페이스를 구현한 클래스는 그림에서 소개한 것보다 많습니다.
- 이 책에서는 프로그램 개발에 많이 사용되고 알아 두어야 하는 클래스 위주로 설명합니다.
Collection 인터페이스

- Collection 인터페이스 하위에는 List 인터페이스와 Set 인터페이스가 있습니다.
- List 인터페이스를 구현한 클래스는 순차적인 자료를 관리하는 데 집중한 클래스입니다.
- List 인터페이스를 구현한 클래스는 중복을 허용하며 대기장 명단과 같은 데이터를 다룰 때 사용합니다.
- Set 인터페이스를 구현한 클래스는 수학 시간에 배운 집합 자료를 관리하는 데 집중한 클래스입니다.
- Set 인터페이스를 구현한 클래스는 중복을 허용하지 않으며 회원 아이디 같은 데이터를 다룰 때 사용합니다.
- Collection 인터페이스에서 자주 사용하는 메소드는 다음과 같습니다.

- 여기서 헷갈려할 만한 요소는 add나 remove 메서드에서 boolean 결과 값을 반환하는 이유는 객체가 잘 추가 & 제거 되었는지 여부를 반환하는 것입니다.
- Collection 인터페이스를 구현한 클래스는 위 메서드를 모두 제공합니다.
- 여기서 재밌는 점은 Collection 인터페이스 하위 인터페이스 List와 Set 인터페이스에서 사용하는 메서드에 차이가 있다는 점입니다.

- Collection 인터페이스의 하위 인터페이스인 Set 인터페이스에서 다루는 데이터는 순서가 없는 집합 데이터들입니다.
- Set 인터페이스에서 다루는 자료는 순서가 없기 때문에 get( ) 메서드를 사용할 수 없습니다.
- 이때, Set 인터페이스를 구현한 클래스에서는 iterator( ) 메서드를 호출하여 Iterator 를 얻는다.
- 그러면 Iterator 클래스를 사용하여 Set 인터페이스를 통해 구현한 요소들을 순회할 수 있다.
Iterator ir = hashSet.iterator( ); - Iterator 를 사용하여 모든 요소를 순회할 때 다음 두 가지 메소드를 사용한다.
boolean hasNext( ) : 다음 요소가 있는지 확인한다.
E next( ) : 다음 요소를 반환한다.
Map 인터페이스
- Map 인터페이스는 하나가 아닌 쌍 Pair 으로 되어 있는 자료를 관리하는 메서드들이 선언되어 있습니다.
- key-value 쌍이라고 표현하는데 이때 키 값은 중복될 수 없습니다.
- 다시 말해서 아래와 같은 경우에 '이름' 이라는 key 는 유일하게 딱 하나 있는 것입니다.
- '이름' 이라는 key 에 해당하는 value 값은 여러 개일 수도 있고 중복될 수도 있습니다.
- '수영' 이라는 이름을 가진 사람과 '수영' 이라는 취미를 가진 사람이 있을 수 있잖아요? 그런 개념입니다.
- 예를 들어 다음 그림과 같은 경우가 있을 수 있다.

- 이름, 나이, 직업, 취미 등은 Key 값이 되고 각 Key 에 해당하는 이지수, 30세, 회사원, 수영 등이 value 값이 됩니다.
- Map 은 자료를 저장할 때 순서가 없기 때문에 index 도 없습니다.
- 따라서 자료를 찾을 때 index 대신 key를 사용합니다.

- 이렇게 key-value 쌍으로 된 자료를 관리할 때 Map 을 유용하게 사용할 수 있습니다.
- Map 은 기본적으로 검색용 자료 구조입니다.
- 즉 어떤 key 값을 알고 있을 때 value 를 찾기 위한 자료 구조입니다.
- Map 인터페이스에 선언된 주요 메서드는 다음과 같습니다.

| boolean isEmpty( ) | Map 이 비었는지 여부를 반환합니다. |
| boolean containsValue(Object value) | Map 에 해당 value 가 있는지 여부를 반환합니다. |
컬렉션 패키지 실습 준비
- 그러면 간단한 회원 관리 프로그램을 만들면서 컬렉션 프레임워크에서 제공하는 각 클래스를 실습해 봅시다.
- 회원 관리 프로그램에서 회원 추가, 회원 삭제, 전체 회원 정보 출력 기능을 구현합니다.
- 모든 실습을 마치고 나면 collection 패키지와 map 패키지 하위에 사용할 클래스에 따른 패키지가 완성될 것입니다.
- 실무에서 일할 때는 이와 같이 계층적으로 패키지 구조를 잡아 소스 코드 파일을 구분하여 사용합니다.
- 계층 구조를 좀 더 명확하게 보려면 Package Explorer 에서 Package Presentation -> Hierarchical 을 선택합니다.
- 그러면 collection 패키지 하위에 프로그램 전반에서 공통으로 사용할 '회원'을 나타내는 Member 클래스를 만들어 보겠습니다.
package collection;
public class Member {
private int memberId;
private String memberName;
public Member(int memberId, String memberName) {
super();
this.memberId = memberId;
this.memberName = memberName;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
@Override
public String toString() {
return memberName + " 회원님의 아이디는 " + memberId + "입니다";
}
}
- 간단하게 member 클래스를 만들었습니다.
- member 클래스는 앞으로 실습할 때 계속 사용할 것입니다.