티스토리 뷰


자료구조 중 Stack을 자바의 제네릭을 이용하여 구현해보고 테스크 코드를 작성해보았다.

자바의 최상위 객체인 Object를 이용한 것인데 제네릭은 이를 이용하여 특정 자료형(ex:String)에 관한

Stack으로 사용할 수 있게끔 한다.


즉, Stack<String> stack = new Stack<String>(); 으로 Stack 객체를 만들고

stack.push("stack"); 와 같이 자료를 넣을 수 있다는 것이고,

stack.push(1); 처럼 선언시 지정한 엘리먼트와 다른 자료형을 코딩하게 되면 컴파일 에러가 나게 된다.



전체 코드는 다음과 같다.


public class Stack<Element> {

private int size;

private int top;

private Object buffer[];


public Stack() {

this(10);

}


public Stack(int size) {

this.top = -1;

this.size = size;

this.buffer = new Object[this.size];

}


public void push(Element number) {

top++;

if (top < size) {

buffer[top] = number;

} else {

size *= 2;

Object[] temp = buffer.clone();

buffer = new Object[this.size];

System.arraycopy(temp, 0, buffer, 0, temp.length);

buffer[top] = number;

}

}


@SuppressWarnings("unchecked")

public Element pop() {

if (top < 0) {

return null;

}

return (Element) buffer[top--];

}

}


=============================================


다음은 Stack 클래스에 대한 테스트 코드이다.


public class StackTest {


private Stack<Integer> integerStack;

private Stack<String> stringStack;

private Stack<Object> objectStack;


@Before

public void setUp() {

integerStack = new Stack<Integer>();

stringStack = new Stack<String>();

objectStack = new Stack<Object>();

}


@Test

public void 빈스택에서_팝하면_널() {

assertEquals(null, integerStack.pop());

}


@Test

public void 스택크기를_넘도록_푸시하고_팝() throws Exception {

for (int i = 0; i < 11; i++) {

integerStack.push(1);

}

for (int i = 0; i < 10; i++) {

integerStack.pop();

}

assertEquals(new Integer(1), integerStack.pop());

assertEquals(null, integerStack.pop());

}


@Test

public void 문자열_스택을_넣고_팝하면_스택() throws Exception {

stringStack.push("스택");

assertEquals("스택", stringStack.pop());

}


@Test

public void 객체도_반환() throws Exception {

Object obj = new Object();

objectStack.push(obj);

assertEquals(obj, objectStack.pop());

}

}



댓글
댓글쓰기 폼