Welcome! Everything is fine.

[4-3] 컬렉션 프레임워크 - ArrayList ~ Stack, Queue, HashSet 본문

자격증 및 기타 활동/J2KB

[4-3] 컬렉션 프레임워크 - ArrayList ~ Stack, Queue, HashSet

개발곰발 2021. 9. 4.
728x90

💡 컬렉션 프레임워크

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

💡 Collection 인터페이스

출처 - <Do it! 자바 프로그래밍 입문>

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

📃 List와 Set의 차이?

List Map
요소가 중복되어도 상관없음 요소의 중복을 허용하지 않음
순서가 있음 순서는 상관없음
배열, Linked Lidt, Stack, Queue 등 HashSet, TreeSet 등

 

  • 여러 클래스들이 Collection 인터페이스를 구현한다.

Collection 인터페이스 주요 메서드

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

💡 List 인터페이스

  • Collection 하위 인터페이스.
  • 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언되어있다.
  • 배열의 기능을 구현하기 위한 인터페이스이다.
  • ArrayList, Vector, LinkedList 등이 많이 사용된다.

아래는 ArrayList로 고객을 관리하는 예제이다. MemberArrayList 클래스는 조금 어려워서 열심히 필기해가며 들었다. 설명하기보단 필기를 올려두는게 나을 것 같아서 출력 결과 아래에 올려두었다.

public class Member {

    private int memberID;
    private String memberName;
	
    public Member(int mbmberID, String memberName) {
        this.memberID = mbmberID;
        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;
    }
	
    public String toString() {
        return memberName + " 회원님의 아이디는 " + memberID + "입니다.";
    }
}
import java.util.ArrayList;
import collction.Member;

public class MemberArrayList {

    private ArrayList<Member> arrayList;
	
    public MemberArrayList() {
        arrayList = new ArrayList<Member>();
    }
	
    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(memberID == tempID) {
                arrayList.remove(i);
                return true;
			}
        }
        System.out.println(memberID + "가 존재하지 않습니다.");
        return false;
	}
	
    public void showAll() {
        for(Member member : arrayList) {
            System.out.println(member);
        }
        System.out.println(arrayList);
    }
}
import collction.Member;

public class MemberArrayListTest {

    public static void main(String[] args) {
		
        MemberArrayList memberArrayList = new MemberArrayList();
		
        Member memberLee = new Member(101, "이순신");
        Member memberKim = new Member(102, "김연경");
        Member memberShin = new Member(103, "신사임당");
		
        memberArrayList.addmember(memberLee);
        memberArrayList.addmember(memberKim);
        memberArrayList.addmember(memberShin);
		
        memberArrayList.showAll();
		
        memberArrayList.removeMember(memberKim.getMemberID());
        memberArrayList.showAll();
    }
}
이순신 회원님의 아이디는 101입니다.
김연경 회원님의 아이디는 102입니다.
신사임당 회원님의 아이디는 103입니다.
[이순신 회원님의 아이디는 101입니다., 김연경 회원님의 아이디는 102입니다., 신사임당 회원님의 아이디는 103입니다.]
이순신 회원님의 아이디는 101입니다.
신사임당 회원님의 아이디는 103입니다.
[이순신 회원님의 아이디는 101입니다., 신사임당 회원님의 아이디는 103입니다.]

Stack과 Queue

Stack과 Queue의 클래스도 이미 있지만, ArrayList를 이용해서 만들기도 한다. Stack과 Queue에 대한 설명은 이전 포스팅에서 정리했고, 이제 그것을 코드로 구현해보았다.

 

먼저 아래 코드는 Stack을 구현한 코드이다. 여기서 pop() 메서드를 구현하는 것에 대해 간단하게 설명하자면, 먼저 마지막에 있는 요소를 꺼내야한다는 것을 기억해야한다. 여기서 맨 마지막 요소라는 것은 (arrayStack의 전체길이 - 1)번째 요소라고 할 수 있다. 따라서 len이라는 변수에 arrayStack.size()를 넣고, 여기에서 -1을 한 값을 return해준다. 그리고 stack이 비었을 경우 underflow error가 발생할 수 있으므로 if문을 활용해 len이 0이라면 "스택이 비었습니다."라는 문구를 출력한 뒤 null을 return하도록 했다. peek() 메서드도 거의 똑같은 코드로 작성하였는데, 다른 점은 get() 메서드를 사용했다는 점이다. get() 메서드를 사용하면 요소를 지우는 것이 아니라 그냥 맨 위에 있는 요소를 꺼내보이는 것이다.

import java.util.ArrayList;

class MyStack{
	
    private ArrayList<String> arrayStack = new ArrayList<String>();
	
    public void push(String data) {
        arrayStack.add(data);
    }
	
    public String pop() {
		
        int len = arrayStack.size();
        if(len == 0) {
            System.out.println("스택이 비었습니다.");
            return null;
        } // 만약 이 코드가 없다면 자바가 죽음(underflow error)
        return arrayStack.remove(len - 1);
    }
	
    public String peek() {
		
        int len = arrayStack.size();
        if(len == 0) {
            System.out.println("스택이 비었습니다.");
            return null;
        } // 만약 이 코드가 없다면 자바가 죽음(underflow error)
        return arrayStack.get(len - 1);
        //그냥 맨 위에 있는걸 꺼내보는 것
    }
}
public class StackTest {

    public static void main(String[] args) {
		
        MyStack stack = new MyStack();
		
        stack.push("a");
        stack.push("b");
        stack.push("c");
		
        System.out.println(stack.peek());
        System.out.println(stack.peek());
        System.out.println(stack.peek());
		
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}
c
c
c
c
b
a
스택이 비었습니다.
null

아래 코드는 Queue를 구현한 코드이다. enQueue() 메서드와 deQueue() 메서드를 구현하였고, 먼저 들어온 요소가 먼저 나가는 Queue의 특징때문에 deQueue() 메서드에서는 무조건 0번째 요소를 지우도록 했다.

import java.util.ArrayList;

class MyQueue{
	
    private ArrayList<String> arrayQueue = new ArrayList<String>();
	
    public void enQueue(String data) {
		arrayQueue.add(data);
    }
	
    public String deQueue() {
        int len = arrayQueue.size();
		
        if(len == 0) {
            System.out.println("큐가 비었습니다.");
            return null;
        }
        return arrayQueue.remove(0);
    }
}
public class QueueTest {

    public static void main(String[] args) {
		
        MyQueue queue = new MyQueue();
		
        queue.enQueue("a");
        queue.enQueue("b");
        queue.enQueue("c");
		
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
        System.out.println(queue.deQueue());
    }
}
a
b
c
큐가 비었습니다.
null

💡 Set 인터페이스

  • Collection 하위 인터페이스.
  • 중복을 허용하지 않기 때문에 아이디, 주민등록번호, 사번 등 유일한 값이나 객체를 관리할 때 사용한다.
  • List는 순서 기반의 인터페이스인 반면, Set은 순서가 없다. 그래서 get(i) 메서드가 제공되지 않는다.
  • 저장된 순서와 출력 순서는 다를 수 있다.

Iterator 사용하여 순회하기

  • Collection의 개체를 순회하는 인터페이스.
  • Iterator를 사용하기 위해서는 Collection의 iterator() 메서드를 호출해야한다.
Iterator ir = MemberArrayList.iterator();
선언된 메서드 내용
boolean hashNext() 이후에 요소가 더 있는지를 체크하는 메서드. 요소가 있다면 true를 반환한다.
E next() 다음에 있는 요소를 반환한다.

MemberArrayList에서 removeMember() 메서드를 수정한 코드이다. for문을 돌려 get(i) 메서드를 사용하는 것 대신에 iterator를 사용했다.

public boolean removeMember(int memberID) {
    Iterator<Member> iterator = arrayList.iterator();
            while(iterator.hasNext()) {
                Member member = iterator.next();
                int tempID = member.getMemberID();
                if(memberID == tempID) {
                    arrayList.remove(member);
                    return true;		
		        }
	        }
            System.out.println(memberID + "가 존재하지 않습니다.");
            return false;
    }

 

다음은 HashSet을 구현한 코드이다. 

hashCode() 메서드와 equals() 메서드를 제외하면 똑같은 코드이다. 또 for문을 사용해 get(i) 메서드를 사용하지 않고 iterator를 사용한다는 점, 중복을 허용하지 않기 때문에 이순신과 같은 ID를 가진 이몽룡은 출력되지 않는다는 점 등을 중점적으로 보면 될 것 같다.

public class Member {

    private int memberID;
    private String memberName;
	
    public Member(int mbmberID, String memberName) {
        this.memberID = mbmberID;
        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;
    }
	
    public String toString() {
        return memberName + " 회원님의 아이디는 " + memberID + "입니다.";
    }
    
    @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;
    }
}
import java.util.HashSet;
import java.util.Iterator;

import collction.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> iterator = hashSet.iterator();
        while(iterator.hasNext()) {
            Member member = iterator.next();
            int tempID = member.getMemberID();
            if(memberID == tempID) {
                hashSet.remove(member);
                return true;		
		    }
        }
        System.out.println(memberID + "가 존재하지 않습니다.");
        return false;
    }

    public void showAll() {
        for(Member member : hashSet) {
            System.out.println(member);
        }
    }
}
import collction.Member;

public class MemberHashSetTest {

    public static void main(String[] args) {
        MemberHashSet memberHashSet = new MemberHashSet();
		
        Member memberLee = new Member(101, "이순신");
        Member memberKim = new Member(102, "김연경");
        Member memberShin = new Member(103, "신사임당");
        
        memberHashSet.addmember(memberLee);
        memberHashSet.addmember(memberKim);
        memberHashSet.addmember(memberShin);
		
        memberHashSet.showAll();
		
        Member memberLee2 = new Member(101, "이몽룡");
        memberHashSet.addmember(memberLee2);
        memberHashSet.showAll();
	}
}
이순신 회원님의 아이디는 101입니다.
김연경 회원님의 아이디는 102입니다.
신사임당 회원님의 아이디는 103입니다.
이순신 회원님의 아이디는 101입니다.
김연경 회원님의 아이디는 102입니다.
신사임당 회원님의 아이디는 103입니다.