Hi

스택을 만들어보자 본문

Programming/Java

스택을 만들어보자

SharingWorld 2018. 3. 29. 10:44
스택을 만들어보자

Stack을 만들어 보자.

1. List를 한쪽 방향으로 넣거나 빼면 스택이다.
2. 기존 클래스(ArrayList, LinkedList)를 재활용해서 만들어보자.

  1. 상속: is-a
  2. 포함
  3. 현대적인 객체 지향 설계에서는 상속을 재사용을 위해 사용하지 않는다.
    상속의 목적?
    : 다형성

4. 상속의 문제점
=> 깨지기 쉬운 기반 클래스의 문제

기존 클래스의 인터페이스를 변경해서 새로운 클래스처럼 보이게 하는 설계 방법
=> 어댑터(Adapter)

import java.util.*;
//import java.util.Stack;

// 라이브러리를 설계할 때
// : 사용하기 편리하게 해야 한다.
// 잘못 사용하기도 어렵게 만들어야 한다.

// Generic
// : 알고리즘은 동일한데, 타입만 다를 경우 사용하는 것이
// 좋다.
// Stack is a ArrayList - X
/*
class Stack<E> extends ArrayList<E> {
	public void push(E e) {
		super.add(e);
	}

	public E pop() {
		return super.remove(super.size() - 1);
	}
}
*/

// 포함을 통한 재사용 장점
// 1. 원하는 메소드만 노출할 수 있다.
// 2. 부모의 구현을 물려받는 것이 아니라, 내부의 필드이기 때문에
// 메소드를 통해 사용할 수 밖에 없다.

// Stack Adapter 라고 합니다.
/*
class Stack<E> {
	// private ArrayList<E> list = new ArrayList<>();
	private List<E> list;
	public Stack(List<E> list) {
		this.list = list;
	}

	public Stack() {
		this.list = new ArrayList<>();
	}

	public void push(E e) {
		list.add(e);
	}

	public E pop() {
		return list.remove(list.size() - 1);
	}
}
*/

public class Sample_0326 {
	public static void main(String[] args) {
// Deque<Integer> stack = new ArrayDeque<Integer>();
		Deque<Integer> stack = new ArrayDeque<>();
		stack.push(10);
		stack.push(20);
		stack.push(30);
		stack.push(40);

		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
	}
/*
public static void main(String[] args) {
	Stack<Integer> s = new Stack<>(); // ArrayList
	// Stack<Integer> s = new Stack<>(new LinkedList<>());
	// s.add();

	s.push(10);
	s.push(20);
	s.push(30);

	System.out.println(s.pop());
	System.out.println(s.pop());
	System.out.println(s.pop());
}
*/