Backend

<Backend> Java / Generic 예제문제

이게왜 2023. 11. 7. 14:09

https://rezerocodinglife.tistory.com/22

 

Start <명품JAVA> ArrayList

명품자바의 예제문제, 실습문제를 풀며 공부해 나갑니다. 목표는 Collection, Generic, Comparable, Comparator, Iterable, Iterator, Stream, Lambda Expression등을 공부하여 이를 활용한 몬테카를로 시뮬레이션 미니 프

rezerocodinglife.tistory.com

공부를 시작하며 작성한 글 입니다. 공부하며 사용한 자료들이 있으니 참고하시면 좋겠습니다.

 

지난 글에서 Generic 을 아주 약간 공부했습니다.

https://rezerocodinglife.tistory.com/25

 

<JAVA Backend> Stack / Generic

https://rezerocodinglife.tistory.com/22 Start ArrayList 명품자바의 예제문제, 실습문제를 풀며 공부해 나갑니다. 목표는 Collection, Generic, Comparable, Comparator, Iterable, Iterator, Stream, Lambda Expression등을 공부하여 이

rezerocodinglife.tistory.com

 

 Generic에 대해 조금 더 공부하고 이번글을 작성합니다.

<Generic 예제문제>

다음 IStack 인터페이스가 있다.

(명품JAVA p.438)

interface IStack<T>{
    T pop();
    boolean push(T ob);
}

Q. IStack<T> 인터페이스를 구현(implement)하는 MyStack<T> 클래스를 작성하라.
   다음은 MyStack<Integer>로 구체화한 정수 스택을 생성하고 활용하는 코드와 실행결과이다.

------------------------------------------------------------------------------------------------------------------------------------

public class StackManager {
    public static void main(String[] args) {
        IStack<Integer> stack = new MyStack<>();
        for (int i=0; i<10; i++) stack.push(i);
        while (true) {
            Integer n = stack.pop();
            if (n == null) break;
            System.out.print(n + " ");
        }
    }
}
------------------------------------------------------------------------------------------------------------------------------------
9 8 7 6 5 4 3 2 1 0
먼저, interface IStack<T> 에 pop(), push(T ob)메소드가 있기 때문에 Java Library에서 지원하는 Stack사용하는 것이 아니라고 판단하였습니다.

 

<1번째 시도>

class MyStack<T> implements IStack {

    private Object[] mystack;
    private int tos;
    private static final int MYSTACK_SIZE = 10;

    public MyStack() {
        this.mystack = new Object[MYSTACK_SIZE];
        this.tos = 0;
    }

    @Override
    public T pop() {
        if (tos == 0) {
            return null;
        } else {
            tos--;
            return (T) this.mystack[tos];
        }
    }

    @Override
    public boolean push(Object ob) {
        if (tos == MYSTACK_SIZE) {
            return false;
        } else {
            this.mystack[tos] = ob;
            tos++;
            return true;
        }
    }
}

 

interface의 push(T ob)메소드를 멋대로 판단하여 배열의 Type을 Object로 초기화 하였습니다.
이는 Generic Programming이 아닙니다... (implement 조차 잘못 했습니다...)

이후, Generic Type의 배열을 생성하려 시도해 보았지만 Java에서는 Generic Type의 배열을 지원하지 않았습니다.
따라서 배열이 아닌 List를 사용하여 다시 코드를 작성해 보았습니다.

 

<수정한 코드>

package self_Generic;

import java.util.ArrayList;
import java.util.List;

public class StackManager {
    public static void main(String[] args) {
        IStack<Integer> stack = new MyStack<>();
        for (int i = 0; i < 10; i++) {
            stack.push(i);
        }
        while (true) {
            Integer n = stack.pop();
            if (n == null) {
                break;
            }
            System.out.print(n + " ");
        }
    }
}

class MyStack<T> implements IStack<T> {

    private final List<T> mystack;
    private int tos;
    private static final int MYSTACK_SIZE = 10;

    public MyStack() {
        this.mystack = new ArrayList<>();
        this.tos = 0;
    }

    @Override
    public T pop() {
        if (tos == 0) {
            return null;
        } else {
            tos--;
            return this.mystack.get(tos);
        }
    }

    @Override
    public boolean push(T ob) {
        if (tos == MYSTACK_SIZE) {
            return false;
        } else {
            this.mystack.add(ob);
            tos++;
            return true;
        }
    }
}

interface IStack<T> {
    T pop();

    boolean push(T ob);
}
가장 먼저 implement를 수정했습니다. (IStack -> IStack<T>)
그 후, Generic Type 'T'의 List를 선언하고 생성자에서 초기화 했습니다.
pop(), push() 메소드는 'List' Library에서 지원하는 get(), add() 메소드를 사용해서 다시 구현하였습니다.

이렇게 Generic을 활용하여 코드의 범용성을 높혀보았습니다. (타입 안정성 또한 확보)

간단한 예제를 풀이하면서도 실수가 있었습니다. 앞으로 Large Programming에서 마음껏 활용하기 위해선 더욱 깊은 공부와 실습이 필요할 것 같습니다.

'Backend' 카테고리의 다른 글

<Backend> Java / Thread (1)  (2) 2023.11.09
<Backend> Java / Generic 예제문제 2  (3) 2023.11.08
<Backend> Java / Stack, Generic  (3) 2023.11.06
<Backend> Java / HashMap 응용  (2) 2023.11.06
<Backend> Java / HashMap  (0) 2023.11.06