Backend

<Backend> Java / Stack, Generic

이게왜 2023. 11. 6. 21:59

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)방식으로 관리하는 자료 구조입니다. 즉, 가장 최근에 추가된 요소가 가장 먼저 꺼내집니다. 

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D

제네릭(Generic)이란?

제네릭은 Java에서 다양한 데이터 유형에 대한 코드의 재사용성을 향상시키기 위한 기능입니다. 제네릭을 사용하면 컴파일 시간에 데이터 유형이 결정되므로 코드의 안정성이 높아집니다.

 

<Stack / Generic 문제>

  1. 스택 자료 구조를 제네릭 클래스로 선언하고, 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