[JAVA] 자료구조 구현 클래스들 - 컬렉션 프레임워크(List,Set,Hash)

WOOK JONG KIM·2022년 9월 14일
0

패캠_java&Spring

목록 보기
16/103
post-thumbnail

컬렉션 프레임워크

  • 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 JDK 라이브러리
  • java.util 패키지에 구현되어 있음
  • 개발에 소요되는 시간을 절약하면서 최적화 된 알고리즘을 사용할 수 있음
  • 여러 구현 클래스와 인터페이스의 활용에 대한 이해가 필요함

  • Document 참조 잘하기

collection, List, Set 같은 것들은 interface

프로그래머가 사용을 위해 직접 구현하는 경우도 많음

Collection 인터페이스

하나의 객체를 관리하기 위한 메서드가 선언된 인터페이스

하위에 ListSet 인터페이스가 있음

List 인터페이스

객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스

자료구조 리스트 (배열, 연결리스트)의 구현을 위한 인터페이스

중복을 허용

ArrayList, Vector, LinkedList, Stack, Queue 등...

Set 인터페이스

순서와 관계없이 중복을 허용하지 않고 유일한 값을 관리하는데 필요한 메서드가 선언됨

아이디, 주민번호, 사번등을 관리하는데 유용

저장된 순서와 출력되는 순서는 다를 수 있음

HashSet, TreeSet등...

Map 인터페이스

쌍(pair)로 이루어진 객체를 관리하는데 사용하는 메서드들이 선언된 인터페이스

객체는 key-value의 쌍으로 이루어짐

key는 중복을 허용하지 않음

HashTable, HashMap, Properties, TreeMap 등이 Map 인터페이스를 구현 함


순차적으로 자료를 관리하는 List 인터페이스를 구현한 클래스와 그 활용

package ch10;

import java.util.ArrayList;

public class MemberArrayList {
	private ArrayList<Member> arrayList; // 기본 capacity는 10
	
	public MemberArrayList() {
		arrayList = new ArrayList<Member>();
	}
	
	public MemberArrayList(int size) {
		arrayList = new ArrayList<Member>(size);
	}
	
	public void addMember(Member member) {
		arrayList.add(member);
	}
	
	public boolean removeMember(int memberId) {
		for(int i = 0; i< arrayList.size();i++) {
			 Member member = arrayList.get(i);
			 
			 int tempId = member.getMemberId();
			 if(tempId == memberId) {
				 arrayList.remove(i);
				 return true;
			 }
				
			}
		System.out.println(memberId + "가 존재하지 않습니다");
		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();
	}
}

Collection 요소를 순회하는 Iterator

  • 컬렉션 프레임워크에 저장된 요소들을 하나씩 차례로 참조하는것
  • 순서가 있는 List인터페이스의 경우는 Iterator를 사용 하지 않고 get(i) 메서드를 활용할 수 있음
  • Set 인터페이스의 경우 get(i) 메서드가 제공되지 않으므로 Iterator를 활용하여 객체를 순회함

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

  • E next() : 다음에 있는 요소를 반환

iterator를 활용한 remove 메서드 구현

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;                   
}

중복되지 않게 자료를 관리하는 Set 인터페이스를 구현한 클래스와 그 활용

Set 인터페이스를 구현한 클래스와 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야 함

동일성 구현을 위해 필요에 따라 equals()hashCode()메서드를 재정의함

package ch12;

import java.util.HashSet;
import java.util.Iterator;

import ch10.Member;

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();
	}
	
}
public class MemberHashSetTest {

	public static void main(String[] args) {

		MemberHashSet memberHashSet = new MemberHashSet();
		
		Member memberLee = new Member(1001, "이순신");
		Member memberKim = new Member(1002, "김유신");
		Member memberKang = new Member(1003, "강감찬");
		
		
		memberHashSet.addMember(memberLee);
		memberHashSet.addMember(memberKim);
		memberHashSet.addMember(memberKang);
		memberHashSet.showAllMember();
		
		Member memberHong = new Member(1003, "홍길동");  
        //1003 아이디 중복으로 추가되어 프린트 됨
        // 멤버 ID가 같으면 같은 사람이라는 것을 인식 시켜 주어야 함
		memberHashSet.addMember(memberHong);
		memberHashSet.showAllMember();
	}
}
// Member.java

...

    @Override
    // 같은 객체일때 동일한 해시코드를 가지게 하는 것!
	public int hashCode() {
		return memberId;
	}

	@Override
    // equals == 객체의 동일성 비교
	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;
	}

...
profile
Journey for Backend Developer

0개의 댓글