https://rezerocodinglife.tistory.com/22
Start <명품JAVA> ArrayList
명품자바의 예제문제, 실습문제를 풀며 공부해 나갑니다. 목표는 Collection, Generic, Comparable, Comparator, Iterable, Iterator, Stream, Lambda Expression등을 공부하여 이를 활용한 몬테카를로 시뮬레이션 미니 프
rezerocodinglife.tistory.com
공부를 시작하며 작성한 글 입니다. 공부하며 사용한 자료들이 있으니 참고하시면 좋겠습니다.
Stack을 사용한 간단한 예제를 공부하였습니다 . feat. 아주 약간의 Generic
스택(Stack) 자료 구조
스택은 데이터를 "후입선출"(Last-In-First-Out)방식으로 관리하는 자료 구조입니다. 즉, 가장 최근에 추가된 요소가 가장 먼저 꺼내집니다.
제네릭(Generic)이란?
제네릭은 Java에서 다양한 데이터 유형에 대한 코드의 재사용성을 향상시키기 위한 기능입니다. 제네릭을 사용하면 컴파일 시간에 데이터 유형이 결정되므로 코드의 안정성이 높아집니다.
<Stack / Generic 문제>
- 스택 자료 구조를 제네릭 클래스로 선언하고, String과 Integer 스택을 각각 사용하는 예를 보여라.
(명품 JAVA p.438)
package self_Generic;
import java.util.Iterator;
import java.util.Stack;
public class Exercise7_9 {
public static void main(String[] args) {
Mystack<Integer> integerMystack = new Mystack<>();
integerMystack.push(1);
integerMystack.push(2);
integerMystack.push(3);
integerMystack.printstack();
Mystack<String> stringMystack = new Mystack<>();
stringMystack.push("a");
stringMystack.push("b");
stringMystack.push("c");
stringMystack.printstack();
//------------------------------------------
ObjectStack<String> stringObjectStack = new ObjectStack<>();
stringObjectStack.push("mike");
stringObjectStack.push("john");
stringObjectStack.push("paul");
// stringObjectStack.printStack(stringObjectStack);
stringObjectStack.push("mike");
stringObjectStack.push("john");
stringObjectStack.push("paul");
ObjectStack<String> reverseStack = stringObjectStack.reverse(stringObjectStack);
for (int i = 0; i < 3; i++) {
System.out.println(reverseStack.pop());
}
}
}
class ObjectStack<T> {
private int tos;
private Object[] stck;
private static final int STCK_SIZE = 3;
public ObjectStack() {
this.tos = 0;
this.stck = new Object[STCK_SIZE];
}
public void push(T item) {
if (tos == STCK_SIZE) {
return;
}
stck[tos] = item;
tos++;
}
public T pop() {
if (tos == 0) {
return null;
}
tos--;
return (T) stck[tos];
}
public ObjectStack<T> reverse(ObjectStack<T> inputStck) {
ObjectStack<T> reverseStck = new ObjectStack<>();
while (true) {
T popItem = inputStck.pop();
if (popItem == null) {
break;
} else {
reverseStck.push(popItem);
}
}
return reverseStck;
}
// public void printStack() {
// ObjectStack copyStack = new ObjectStack();
// for (int i = 0; i < STCK_SIZE; i++) {
// System.out.println(objectStack.pop());
// }
// }
}
class Mystack<T> {
private Stack<T> stack;
public Mystack() {
this.stack = new Stack<>();
}
public void push(T item) {
this.stack.push(item);
}
public T pop() {
return this.stack.pop();
}
public void printstack() {
Iterator iterator = this.stack.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
Stack을 구현한 간단한 예제입니다. 또한 Generic Type 'T'를 사용하였습니다.
main Method에서 'Mystack' 또는 'ObjectStack'의 instance 객체를 생성할 때 Wrapper Class를 사용하여 Generic Type 'T'를 새로 정의하였습니다.
이를 통해 사용자는 원하는 Type의 instance를 생성하고 사용할 수 있습니다.
이처럼 Generic Type을 사용하면 코드의 범용성을 높일 수 있습니다.
간단한 Stack과 Generic 예제라서 쉽게 느껴질 수 있지만, 대규모 프로젝트에서 코드의 가독성과 범용성을 높이기 위해 널리 사용되므로 정확히 이해하고 코드도 직접 작성해 보며 공부하고 넘어가야 하는 부분이라고 생각합니다.
'Backend' 카테고리의 다른 글
<Backend> Java / Generic 예제문제 2 (3) | 2023.11.08 |
---|---|
<Backend> Java / Generic 예제문제 (2) | 2023.11.07 |
<Backend> Java / HashMap 응용 (2) | 2023.11.06 |
<Backend> Java / HashMap (0) | 2023.11.06 |
Start <명품JAVA> ArrayList (2) | 2023.11.06 |