JAVA Basic) 컬렉션 프레임워크
Programming/Java 기초

JAVA Basic) 컬렉션 프레임워크

728x90

목차

     


     

    <컬렉션 프레임워크란?>

    흔히 프로그래밍을 건축에 비유를 한다. 원하는 건물을 지으려면 구조를 잘 잡아야하듯, 프로그램 개발도 사용하는 자료를 어떤 구조로 관리할 것인지가 중요하기 때문이다.
    그래야 프로그램의 기능을 효과적으로 구현할 수 있기 때문!

    이때 사용하는 것이 '자료 구조(data structure)'
    '자료 구조'
    는 프로그램 실행 중 메모리에 자료를 유지·관리하기 위해 사용한다.

    자바에서는 필요한 자료 구조를 미리 구현하여 java.util 패키지에 제공하고 있는데,
    이를 '컬렉션 프레임워크(collection framework)'라고 한다.

    자료 구조는 개발자가 필요할 때 직접 만들어 사용할 수도 있다. 하지만 자바 '컬렉션 프레임워크'를 사용하면 직접 개발하는 수고를 덜 수 있을 뿐만 아니라 잘 만들어진 자료 구조 클래스를 활용할 수 있다. 

    앞에서 다룰 내용은 자바에서 제공하는 자료 구조 라이브러리다. 자바가 라이브러리를 어떻게 제공하는지, 또 그 라이브러리를 어떻게 사용하는지 살펴볼 것이다.

    자바 컬렉션 프레임워크에는 여러 인터페이스가 정의되어 있고, 그 인터페이스를 구현한 클래스가 있다.
    각 인터페이스의 특성과 클래스 활용법을 알면 개발 목적에 맞게 활용이 가능하다.

    가장 대표적인 Collection과 Map 인터페이스

    컬렉션 프레임워크의 전체 구조는 'Collection'과 'Map' 인터페이스 기반으로 이루어져 있다. 

    • Collection 인터페이스하나의 자료를 모아서 관리하는 데 필요한 기능을 제공.
    • Map 인터페이스쌍(pair)으로 된 자료들을 관리하는 데 유용한 기능을 제공.

    각 인터페이스를 구현한 클래스는 그림으로 소개한 것 보다 많다. 여기서는 프로그램 개발에 많이 사용되고 알아 두어야 하는 클래스 위주로 설명한다.

     

    <Collection 인터페이스>

    Collection 인터페이스 하위에 List와 Set인터페이스가 있다.

    • List를 구현한 클래스는 순차적인 자료를 관리하는 데 사용하는 클래스.
    • Set 인터페이스는 수학의 집합을 생각하면 편하다.
      집합은 순서도 상관없고, 중복을 허용하지 않는다. 따라서 Set 계열의 클래스는 ID처럼 중복되지 않는 객체를 다루는데 사용한다.

    Collection 인터페이스의 하위 인터페이스 List, Set

     

    Collection 인터페이스에서 자주 사용되는 메서드는

    메서드 설명
    boolean add(E e) Collection에 객체를 추가한다. (+boolean 여부)
    void clear() Collection의 모든 객체를 제거한다.
    Iterator<E> iterator Collection을 순환할 반복자(Iterator)를 반환한다.
    boolean remove(Object o) Collection에 매개변수에 해당하는 인스턴스가 존재하면 제거한다. (+boolean 여부)
    int size() Collection에 있는 요소의 개수를 반환한다.

    add()나 remove() 메서드가 boolean형으로 결과 값을 반환하는 이유는 객체가 잘 추가, 제거 되었는지 여부를 반환하는 것이다. Collection 인터페이스를 구현한 클래스는 위 메서드를 모두 제공한다.

     

    <Map 인터페이스>

    'Map 인터페이스'쌍(pair)으로 되어 있는 자료를 관리하는 메서드들이 선언되어 있다.
    key-value 쌍이라고 하는데 학번과 이름처럼 쌍으로 되어있는 자료를 관리할 때 사용하면 편리하다.
    이때 key값은 중복이 안된다. (예를 들어 학번, ID 등)

    Map 인터페이스를 구현한 클래스 중 대표 클래스는 다음과 같다.

    Collection인터페이스의 Map인터페이스의 대표 클래스

    예를 들어 어떤 사람의 정보가 있다고 할 때 그냥 나열할 수도 있지만 아래 처럼 쓸 수도 있다.

    Key Value
    이름 이지수
    나이 30세
    직업 회사원, 프리랜서
    취미 수영, 테니스
    특기 수영

    이때 이름, 나이 등의 값Key라고 하고, 그에 대응하는 이지수, 30세 등의 값value라고 한다.
    이런 자료를 key-value 쌍이라고 한다. 여기서 key 값은 중복이 될 수 없다.
    다시 말해 '이름'이라는 key 값은 유일하게 딱 하나 있는 것. 이에 대응하는 value값은 여러 개로 중복될 수 있다.
    이렇게 key-value 쌍으로 된 자료를 관리할 때 Map을 유용하게 사용할 수 있다.

    Map은 기본적으로 검색용 자료 구조이다. 즉 어떤 Key값을 알고 있을 때 value를 찾기 위한 자료 구조.

    Map 인터페이스에 선언된 메서드 중 주요 메서드는 다음과 같다.

    메서드 설명
    V put(K key, V value) Key에 해당하는 value 값을 map에 넣는다.
    V get(K key) key에 해당하는 value 값을 반환한다.
    boolean isEmpty() Map에 비었는지 여부를 반환한다.
    boolean containsKey(Object key) Map에 해당 key가 있는지 여부를 반환한다.
    boolean containsValue(Object key) Map에 해당 value가 있는지 여부를 반환한다.
    Set keyset() key 집합을 Set으로 반환한다. (중복 안 되므로 Set) 
    Collection values() value를 Collection으로 반환한다. (중복 무관)
    V remove(key) key가 있는 경우 삭제한다.
    boolean remove(Object key, Object value) key가 있는 경우 key에 해당하는 value가 매개변수와 일치할 때 삭제한다.

     

    <패키지 구조>

    회원 관리 프로그램을 만들며 컬렉션 프레임워크에서 제공하는 각 클래스를 실습해보자!

    회원 추가, 회원 삭제, 전체 회원 정보 출력 기능을 구현한다.
    collection 패키지와 map 패키지 하위에 사용할 클래스에 따른 패키지가 다음처럼 완성될 것이다.

    프로그램 구현 후 패키지

    실무에서는 이와 같이 계층적으로 패키기 구조를 잡아 소스 코드 파일을 구분하여 사용한다.
    계층 구조를 좀 더 명확하게 보려면,
    Package Explorer에서 화살표를 눌러 [Package Presentation - Hierarchical] 메뉴를 선택하면 된다.

    그럼 collection 패키지 하위 프로그램 전반에서 공통으로 사용할 '회원'을 나타내는 Member 클래스를 만들어보자.
    Member 클래스 속성(멤버 변수)은 간단히 아이디와 이름만 구현한다.

    package collection;
    
    public class Member {
    	private int memberId; //회원 ID
    	private String memberName; //이름
    	
    	public Member(int memberId, String memberName) {
    		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 + "입니다.";
    	} //toString()메서드 재정의
    }
    • 아이디와 이름은 private 변수로 선언하고 get(), set() 메서드를 public으로 제공한다.
    • 나중에 회원 정보를 출력하기 위해 toString() 메서드를 재정의하여 구현.

    Member 클래스는 앞으로 실습할 때 계속 사용될 것이다

     

    300x250