컬렉션 프레임워크_Stack, Queue, HashSet

0

Java 공부

목록 보기
18/18

Stack

  • 먼저 들아간 자료가 나중에 나오는 LIFO(Last In First Out)구조
import java.util.ArrayList;

class MyStack {
	private ArrayList<String> arrayStack = new ArrayList<String>();

	// Stack은 데이터를 쌓는 구조를 가지고 있다.
	public void push(String data) { // stack의 데이터를 넣는 구조를 push
		arrayStack.add(data);
	}
	public String pop() { // 데이터 삭제를 pop
		// stack은 LIFO구조로 마지막으로 push된 데이터가 가장먼저 pop된다.
		int len = arrayStack.size(); // 만약 stack이 비어있다면 뺄 수 있는것이 없는데 빼는것이 될 수 있다(에러).
		if (len == 0) {
			System.out.println("스텍이 비었습니다.");
			return null;
		}
		return arrayStack.remove(len -1); // 전체 사이즈(배열의 수)는 0부터 개수를 세기때문에 -1을 해준다.
		
	}
}

public class StackTest {

	public static void main(String[] args) {

		MyStack stack = new MyStack();
		
		stack.push("a");
		stack.push("b");
		stack.push("c");
		stack.push("d");
		
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		
		System.out.println(stack.pop());
	}
}

d
c
b
a
스텍이 비었습니다.
null

마지막에 push된 d부터 출력되어 a로 끝나며,
벼열수가4개인데 5개를뺀다면, 에러가 송출된다. 이때를 위해 pop()에서 if문작성하였다.


Queue

  • 먼저 들어간 데이터가 먼저 나가는 구조FIFO(First In First Out)
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 que = new MyQueue();
		
		que.enQueue("a");
		que.enQueue("b");
		que.enQueue("c");
		que.enQueue("d");
		
		System.out.println(que.deQueue());
		System.out.println(que.deQueue());
		System.out.println(que.deQueue());
		System.out.println(que.deQueue());
		
		System.out.println(que.deQueue());
	}
}

a
b
c
d
큐가 비었습니다.
null

선입선출FIFO(First In First Out)로 먼저 입력된a가 먼저 지워지게 된다.



Set 인터페이스

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

public class HashSetTest {

	public static void main(String[] args) {
		
		HashSet<String> set = new HashSet<>();
		
		boolean a = set.add("aaa");
		set.add("bbb");
		set.add("ccc");
		
		System.out.println(set);
		
		System.out.println("--중복 확인--");
		set.add("aaa");
		System.out.println(set);
		
		System.out.println("--중복 확인--");
		boolean a1 = set.add("aaa");
		System.out.println(a);
		System.out.println(a1);
	}
}

[aaa, ccc, bbb]
--중복 확인--
[aaa, ccc, bbb]
--중복 확인--
true
false

HashSet

MemberHashSet

package collection.hashset;

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

import collection.Member;

public class MemberHashSet {

	private HashSet<Member> hashSet;

	public MemberHashSet() {
		hashSet = new HashSet<Member>();
	}

	public void addMember(Member member) {
		hashSet.add(member);
	}

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

	public boolean removeMamber(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;
	}
}

MemberHashSetTest

package collection.hashset;

import collection.Member;

public class MemberHashSetTest {

	public static void main(String[] args) {
		
		MemberHashSet memberHashSet = new MemberHashSet();
		
		Member Lee = new Member(1001, "이순신" , 98);
		Member Kim = new Member(1002, "김유신", 90);
		Member Park = new Member(1003, "박혁거세", 85);
		
		memberHashSet.addMember(Lee);
		memberHashSet.addMember(Kim);
		memberHashSet.addMember(Park);
		
		memberHashSet.showAll();
		System.out.println("////////");
		
		Member Lee2 = new Member(1001, "이몽룡" , 98);
		memberHashSet.addMember(Lee2);
		
		memberHashSet.showAll();
	}
}

김유신회원님의 아이디는1002 입니다. 신용점수는 90
이순신회원님의 아이디는1001 입니다. 신용점수는 98
박혁거세회원님의 아이디는1003 입니다. 신용점수는 85
////////
김유신회원님의 아이디는1002 입니다. 신용점수는 90
이몽룡회원님의 아이디는1001 입니다. 신용점수는 98
이순신회원님의 아이디는1001 입니다. 신용점수는 98
박혁거세회원님의 아이디는1003 입니다. 신용점수는 85

이순신의 아이디 1001
이몽룡의 아이디 1001

HashSetTest 에서 aaa는 중복되면 적용되지 않았다.
MemberHashSetTest 에서 이순신과 이몽룡의 아이디는 중복적용되고 있다.

  • 아이디를 중복없이 사용하려면 Member.java에서 hashCode()와 equals()를 오버라이드 해줘야한다.
  • Member.java
	// MemberHashSetTest에서 memberId가 같으면 
	@Override
	public int hashCode() {
		return memberId;
	}

	@Override // equals=비교연산자
	public boolean equals(Object obj) {
		if (obj instanceof Member) { // Member 인지 먼저 체크
			Member member = (Member)obj; // 다운캐스팅
			if (this.memberId == member.memberId) { // memberId와 비교할 equals로 넘어온 member의 memberId가 같으면
				return true;
			}
			else {
				return false;
			}
		}
		return false; // Member 아니면 false
	}

이순신회원님의 아이디는1001 입니다. 신용점수는 98
김유신회원님의 아이디는1002 입니다. 신용점수는 90
박혁거세회원님의 아이디는1003 입니다. 신용점수는 85
////////
이순신회원님의 아이디는1001 입니다. 신용점수는 98
김유신회원님의 아이디는1002 입니다. 신용점수는 90
박혁거세회원님의 아이디는1003 입니다. 신용점수는 85

기존 같은 아이디1001로 작성된 이순신과 이몽룡에서 이몽룡이 중복적용되어 출력되지 않았다.

0개의 댓글