Programming/Java_자바

[JAVA 기초] Collection 인터페이스 (컬렉션 인터페이스)와 ArrayList 예제 실습

LEFT 2022. 1. 15. 21:29

Explain


컬렉션 인터페이스 (Collection Interface)

: 하나의 객체를 관리하기 위한 메서드가 정의된 인터페이스
: 하위에 List와 Set 인터페이스를 가짐

1. 리스트 인터페이스 (List Interface)
- 순서가 있는 자료관리, 중복을 허용
- 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
- 배열의 기능을 구현하기 위한 인터페이스
- 이 인터페이스를 구현한 클래스는 ArrayList / Vector / LinkedList / Stack / Queue 등이 있음

2. 세트 인터페이스 (Set Interface)
- 자료관리에 순서가 없음, 중복을 허용하지 않음
- 이 인터페이스를 구현한 클래스는 HashSet / TreeSet 이 있음
- 아이디, 주민번호 등 유일한 값이나 객체를 관리할 때 사용
- 저장된 순서와 출력순서는 다를 수 있음
- get(i) 메서드가 제공되지 않음


배열 리스트 (ArrayList)
- 객체 배열을 구현한 클래스

<MemberArrayList.java>

package chapter12_collection.arraylist;

import java.util.ArrayList;

import chapter12_collection.Member;

public class MemberArrayList {
	
	private ArrayList<Member> arrayList; // ArrayList 생성만 한 상태
	
	public MemberArrayList() // 생성자
	{
		arrayList = new ArrayList<Member>(); // 객체 생성
	}
	
	public void addMember(Member member)
	{
		arrayList.add(member); // add메서드로 arrayList에 member를 추가하는 코드
	}
	
	public boolean removeMember(int memberId) // 멤버를 하나씩 제거하는 기능 구현
	{
		for( int i = 0; i < arrayList.size(); i++)
		{
			Member member = arrayList.get(i);
			int tempId = member.getMemberId();
			
			if(memberId == tempId) // 임시로 저장한 아이디와 같으면
			{
				arrayList.remove(i); // remove()메서드로 제거
				return true; 		// true 반환
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다.");
		return false;
	}
	
	public void showAll() { // 다 보여주는 메서드
		
		for (Member member : arrayList)
		{
			System.out.println(member);
		}
		System.out.println(); // 반복문마다 개행
		
		System.out.println(arrayList);
	}
}

이처럼 arrayList배열로부터 멤버의 값을 받아오고, 그 멤버를 검증하는 과정을 통해 구현할 수 있다.

반면, public boolean removeMember(int memberId) 코드에서 for문을
순회(Iterator)를 활용하는 방법으로 바꿀 수 있는데, 

여기서 Iterator란 'Collection의 개체를 순회하는 인터페이스'를 말한다.
밑의 예제는 for문 대신 iterator() 메서드를 호출하고, 사용하는 예제이다.

package chapter12_collection.arraylist;

import java.util.ArrayList;
import java.util.Iterator;

import chapter12_collection.Member;

public class MemberArrayList {
	
	private ArrayList<Member> arrayList; // ArrayList 생성만 한 상태
	
	public MemberArrayList() // 생성자
	{
		arrayList = new ArrayList<Member>(); // 객체 생성
	}
	
	public void addMember(Member member)
	{
		arrayList.add(member); // add메서드로 arrayList에 member를 추가하는 예제
	}
	
	public boolean removeMember(int memberId) // 멤버를 하나씩 제거하는 기능 구현
	{		
		Iterator<Member> iterator = arrayList.iterator();
		while(iterator.hasNext()) // 다음번에 가져올 요소가 있냐를 물어보는 메서드 hasNext(), hasNext의 커서는 맨 첫번째 요소에 있기때문에 모든 멤버를 순회하기에 효과적
		{
			Member member = iterator.next(); // 다음 멤버의 요소를 가져와서 member에 저장 // 위 for문에서 arrayList.get(i)와 비슷한 역할
			int tempId = member.getMemberId();
			
			if(memberId == tempId) // 임시로 저장한 아이디와 같으면
			{
				arrayList.remove(member); // remove()메서드로 제거
				return true; 		// true 반환
			}
		}
		
		
		System.out.println(memberId + "가 존재하지 않습니다.");
		return false;
	}
	
	public void showAll() { // 다 보여주는 메소드
		
		for (Member member : arrayList)
		{
			System.out.println(member);
		}
		System.out.println(); // 반복문마다 개행
		
		System.out.println(arrayList);
	}
}

이 코드에서 Iterator<Member> iterator = arrayList.iterator();

<Member>처럼 제네릭으로 선언해주어 불러올떄 타입을 지정하지 않도록 할 수 있다.

다음으로는 MemberArrayList를 테스트할 클래스를 만들어준다.
<MemberArrayListTest.java>

package chapter12_collection.arraylist;

import chapter12_collection.Member;

// MemberArrayList가 테스트할 테스트코드

public class MemberArrayListTest {

	public static void main(String[] args) {
		
		MemberArrayList memberArrayList = new MemberArrayList();
		
		Member memberSong = new Member(101, "송강호");
		Member memberHwang = new Member(102, "황인욱");
		Member memberJan = new Member(103, "잔나비");
		
		memberArrayList.addMember(memberSong);
		memberArrayList.addMember(memberHwang);
		memberArrayList.addMember(memberJan);
		
		memberArrayList.showAll();
		
		memberArrayList.removeMember(memberSong.getMemberId());
		

	}

}

Result