Java

[Java] 컬렉션 프레임워크

인생은단짠단짠 2022. 10. 1. 22:00

 

컬렉션 프레임워크

 

프로그램 구현에 필요한 자료구조를 구현해 놓은 JDK라이브러리입니다.

 

  • java.util 패키지에 구현되어 있음
  • 개발에 소요되는 시간을 절약하면서 최적화 된 알고리즘을 사용할 수 있음

 

 

Tree라는 말이 앞에 붙으면 정렬이 된다고 생각하면 됩니다.(바이너리 서치 트리)

 

 

 

Collection 인터페이스

 

  • 하나의 객체를 관리하기 위한 메서드가 선언된 인터페이스의
  • 하위에 List와 Set 인터페이스가 있음

 

List 인터페이스

  • 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
  • 자료구조 리스트 (배열, 연결리스트)의 구현을 위한 인터페이스
  • 중복을 허용함
  • ArrayList, Vector, LinkedList, Stack, Queue 등...

 

ArrayList

ArrayList를 이용한 MemberArrayList 구현

public class MemberArrayList {

	private ArrayList<Member> arrayList;  // ArrayList 선언 

	public MemberArrayList(){
		arrayList = new ArrayList<Member>();  //멤버로 선언한 ArrayList 생성
	}
	
	public void addMember(Member member){  //ArrayList 에 멤버 추가
		arrayList.add(member);
	}
	
	public boolean removeMember(int memberId){  // 멤버 아이디를 매개변수로, 삭제 여부를 반환
		
		for(int i =0; i<arrayList.size(); i++){ // 해당 아이디를 가진 멤버를 ArrayList에서 찾음
			Member member = arrayList.get(i);
			int tempId = member.getMemberId();
			if(tempId == memberId){            // 멤버아이디가 매개변수와 일치하면 
				arrayList.remove(i);           // 해당 멤버를 삭제
				return true;                   // true 반환
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");  //for 가 끝날때 까지 return 이 안된경우
		return false;                   
	}
	
	public void showAllMember(){
		for(Member member : arrayList){
			System.out.println(member);
		}
		System.out.println();
	}
}
public class MemberArrayListTest {

	public static void main(String[] args) {

		MemberArrayList memberArrayList = new MemberArrayList();
		
		Member memberLee = new Member(1001, "이순신");
		Member memberKim = new Member(1002, "김유신");
		Member memberKang = new Member(1003, "강감찬");
		Member memberHong = new Member(1004, "홍길동");
		
		memberArrayList.addMember(memberLee);
		memberArrayList.addMember(memberKim);
		memberArrayList.addMember(memberKang);
		memberArrayList.addMember(memberHong);
		
		memberArrayList.showAllMember();
		
		memberArrayList.removeMember(memberHong.getMemberId());
		memberArrayList.showAllMember();
	}
}

 

Set 인터페이스

  • 순서와 관계없이 중복을 허용하지 않고 유일한 값을 관리하는데 필요한 메서드가 선언됨
  • 아이디, 주민번호, 사번등을 관리하는데 유용
  • 저장된 순서와 출력되는 순서는 다를 수 있음
  • HashSet, TreeSet등...

 

HashSet

 

  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함
  • 동일성 구현을 위해 필요에 따라 equals()와 hashCode()메서드를 재정의함

 

HashSet을 이용한 MemberHashSet구현

public class MemberHashSet {
	private HashSet<Member> hashSet;

	public MemberHashSet(){
		hashSet = new HashSet<Member>();
	}
	
	public void addMember(Member member){
		hashSet.add(member);
	}
	
	public boolean removeMember(int memberId){

		Iterator<Member> ir = hashSet.iterator();
		
		while( ir.hasNext()){
			Member member = ir.next();
			int tempId = member.getMemberId();
			if( tempId == memberId){
				hashSet.remove(member);
				return true;
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");
		return false;
	}
	
	public void showAllMember(){
		for(Member member : hashSet){
			System.out.println(member);
		}
		System.out.println();
	}
}

아이디가 동일한 경우 같은 멤버이므로 중복되지 않도록 Member클래스의 equals()와 hashcode()메서드 재정의해야 합니다.

 

Member.java

	@Override
	public int hashCode() {
		return memberId;
	}

	@Override
	public boolean equals(Object obj) {
		if( obj instanceof Member){
			Member member = (Member)obj;
			if( this.memberId == member.memberId )
				return true;
			else 
				return false;
		}
		return false;
	}

hashcode()메서드 같은 경우 물리적으로 같은 위치에 있지 않지만 논리적으로 같은 객체라는 것을 나타내기 위해 memberId로 지정해줬습니다. 주로 equals 메서드에서 같은지 비교하는 필드를 리턴합니다.

 

 

TreeSet

 

  • 객체의 정렬에 사용하는 클래스
  • Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
  • 내부적으로 이진검색트리(binary search tree)로 구현됨
  • 이진검색트리에 저장하기 위해 각 객체를 비교해야 함
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음
  • String, Integer등 JDK의 많은 클래스들이 이미 Comparable을 구현했음

 

 

TreeSet을 이용한 MemberTreeSet구현

public class MemberTreeSet {

	private TreeSet<Member> treeSet;

	public MemberTreeSet(){
		treeSet = new TreeSet<Member>();
	}
	
	public void addMember(Member member){
		treeSet.add(member);
	}
	
	public boolean removeMember(int memberId){
		
		Iterator<Member> ir = treeSet.iterator();
		
		while( ir.hasNext()){
			Member member = ir.next();
			int tempId = member.getMemberId();
			if( tempId == memberId){
				treeSet.remove(member);
				return true;
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");
		return false;
	}
	
	public void showAllMember(){
		for(Member member : treeSet){
			System.out.println(member);
		}
		System.out.println();
	}
}

Member클래스가 아이디 오름차순으로 정렬되게 하기 위해 Comparable 인터페이스를 구현

 

Member.java

public class Member implements Comparable<Member>{

	......

	@Override
	public int compareTo(Member member) {
		
		//return (this.memberId - member.memberId);   //오름차순
		return (this.memberId - member.memberId) *  (-1);   //내림 차순
	}
}

 

Map 인터페이스

  • 쌍(pair)로 이루어진 객체를 관리하는데 사용하는 메서드들이 선언된 인터페이스
  • 객체는 key-value의 쌍으로 이루어짐
  • key는 중복을 허용하지 않음
  • HashTable, HashMap, Properties, TreeMap 등이 Map 인터페이스를 구현 함

 

 

HashMap

 

  • 가장 많이 사용되는 Map 인터페이스 기반 클래스
  • key - value를 쌍으로 관리하는 메서드를 구현함
  • 검색을 위한 자료구조
  • key를 이용하여 값을 저정하고 key를 이용하여 값을 꺼내오는 방식 - hash 알고리즘으로 구현 됨
  • key가 되는 객체는 중복될 수 없고 객체의 유일성을 비교를 위한 equals()와 hashCode() 메서드를 구현해야 함

 

 

HashMap을 이용해서 구현한 MemberHashMap

public class MemberHashMap {

	private HashMap<Integer, Member> hashMap;
	
	public MemberHashMap()
	{
		hashMap = new HashMap<Integer, Member>();
	}
	
	public void addMember(Member member){
		
		hashMap.put(member.getMemberId(), member);
		
	}
	
	public boolean removeMember(int memberId){
		
		if(hashMap.containsKey(memberId)){
			hashMap.remove(memberId);
			return true;
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");
		return false;
	}
	
	public void showAllMember(){
		Iterator<Integer> ir = hashMap.keySet().iterator();
		while (ir.hasNext()){
			int key = ir.next();
			Member member = hashMap.get(key);
			System.out.println(member);
		}	
		System.out.println();
	}
}

showAllmember함수 저렇게 안하고 그냥 print hashmap해도 key, value값 나옵니다.

 

 

TreeMap 클래스

treeset + hashmap

  • Map 인터페이스를 구현한 클래스이고 key에 대한 정렬을 구현할 수 있음
  • key가 되는 클래스에 Comparable이나 Comparator인터페이스를 구현함으로써 key-value 쌍의 자료를 key값 기준으로 정렬하여 관리 할 수 있음

 

 

Iterator

Collection 요소를 순회합니다.

 

요소의 순회란?

컬렉션 프레임워크에 저장된 요소들을 하나씩 차례로 참조하는 것입니다.

 

 

  • 순서가 있는 List인터페이스의 경우는 Iterator를 사용 하지 않고 get(i) 메서드를 활용할 수 있음
  • Set 인터페이스의 경우 get(i) 메서드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회함

 

 

Iterator 사용하기

 

  • boolean hasNext() : 이후에 요소가 더 있는지를 체크하는 메서드, 요소가 있다면 true를 반환
  • E next() : 다음에 있는 요소를 반환

 

MemberArrayList의 remove 메서드를 iterator로 구현

public boolean removeMember(int memberId){  // 멤버 아이디를 매개변수로, 삭제 여부를 반환
	
		Iterator<Member> ir = arrayList.iterator();
		while(ir.hasNext()) {
			Member member = ir.next();
			int tempId = member.getMemberId();
			if(tempId == memberId){            // 멤버아이디가 매개변수와 일치하면 
				arrayList.remove(member);           // 해당 멤버를 삭제
				return true;                   // true 반환
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");  //for 가 끝날때 까지 return 이 안된경우
		return false;                   
}

 

 

 

'Java' 카테고리의 다른 글

[Java] 제네릭 프로그래밍  (0) 2022.10.01
[Java] 자료구조  (0) 2022.10.01
[Java] 다형성 / 다운 캐스팅  (1) 2022.09.23
[Java] 상속  (1) 2022.09.23
[Java] Random값 생성  (0) 2022.09.22