ㅠㅠ 섹션2에 들어서면서
난이도가 확 상승한 느낌이다.
어제도 Json관련 공부를 했고
변환 클래스 메서드를 이용하지 않고
내가 직접 형변환을 하는 프로그램을 연습했었다.

어렵게어렵게 이해하고 작성하기까지 했지만
아직까진 모든게 어색하고 처음이라
머리에 들어오는 것이 많은지 과부하상태이다.

그래도 하루하루 배워간다는 재미에 만족을 느끼며
오늘도 공부를시작해보자!
오늘 배울 것은 Stack과 Queue이다.

image

자료구조에 대한 내용들을 이번주 마지막과
다음주에 주로 배울 내용이다.
이 중에서 Stack과 Queue에 대해 간한히 알아보자.


Stack

말 그대로 직역하듯이 쌓다라는 의미를 가지고 있다.
데이터를 순서대로 쌓는 자료구조이고
꺼낼때는 마지막에 들어온 것 부터 빠져나가는 특성이있다.
LIFO (Last In First Out)에 대해 알아보자

image

스택 자료구조에 대해 아주 적합한 사진이다.
이를 프로그램으로 적용해서 알아보자

public static void main(String[] args) {
    Stack<Integer> example = new Stack<>();
    System.out.println(example.push(1));; // 1
    example.push(2);
    example.push(3);
    example.push(4);
    example.push(5);
    System.out.println(example); // [1,2,3,4,5]

    System.out.println(example.pop()); // 5
    System.out.println(example); // [1,2,3,4]
}

우선 Stack 클래스의 메서드를 사용해야한다.
Stack 클래스로 객체를 만들어

.push() : 데이터가 순서대로 쌓임
.pop(): 데이터가 마지막에있는 것 부터 지워짐.

위에서 볼 수 있듯이

List와 비슷하게 push를 하게되면 데이터를 순서대로 쌓게된다.
그리고 pop메서드를 이용하게되면 마지막에 쌓인 것 부터
삭제하게 되는 LIFO 형식의 자료구조이다.

여기서 한단계 더 나아가 ArrayList 자료를 이용해
Stack 클래스에 있는 메서드를 구현해보자.

class ArrayListStack<E> {
    ArrayList<E> buffer = new ArrayList<>();
    public E push(E item){
        buffer.add(item);
        return buffer.get(0);
    }
    public E pop(){
        E deleteTarget = buffer.get(buffer.size() - 1);
        buffer.remove(buffer.size()-1);
        return deleteTarget;
    }
    public String show(){
        String test = String.valueOf(buffer);
        return test;
    }
}

위에는 내가 임의로 만든 ArrayListStack 이라는 클래스다.
스택에서 사용하는 메서드인 push와 pop을
ArrayList 클래스를 이용해 구현해보았다.

public class StackArrayListTest {
    public static void main(String[] args) {
        ArrayList<Integer> example = new ArrayList<>();

        ArrayListStack<Integer> stackTest = new ArrayListStack();
        System.out.println(stackTest.push(1));;
        stackTest.push(2);
        stackTest.push(3);
        System.out.println(stackTest.show());

        stackTest.pop();
        System.out.println(stackTest.show());
        stackTest.pop();
        System.out.println(stackTest.show());

    }
}

메인 메서드에서 해당 클래스의
메서드를 사용하게되면 Stack 클래스와 동일하게
동작되는 것을 확인 할 수 있다.

이를 통해서 우리는 Stack 클래스안에서 어떻게 메서드가 동작하고있는지를
유추해볼 수 있다.


Queue

Queue 줄을 서다 라는 의미를 가지고있다.
우리가 롤이란 게임을 할때 큐잡혔다.
이런식으로 얘기한다. 줄을 서서 내순서가 잡혔다라는 뜻이다.
말그대로 첫번째로 온 사람이 가장먼저 게임을 시작하는 것이다.

즉, 첫번쨰로 저장된 객체를 가장 첫번쨰로 배출한다는 의미다.
스태과 동일하게 프로그램을 통해 알아보자

public static void main(String[] args) {
    Queue<Integer> example = new LinkedList<>();
    example.add(1);
    example.add(2);
    example.add(3);
    System.out.println(example); // [1, 2, 3]

    example.poll();
    System.out.println(example); // [2, 3]
    System.out.println(example.poll()); // 2
    System.out.println(example); // [3]

}

Queue는 인터페이스로 Collection에 상속받고있다.
인터페이스 안에는 .add, .poll 등의 메서드가 추상화되어있다.
구현체인 LinkedList로 객체를 만들어
add,poll과 같은 메서드를 이용하면 데이터 추가와 삭제가 가능하다.
Queue 자료구조형과 같이 첫번째로 저장된 객체가
poll()메서드 실행시 먼저 삭제된 모습을 볼 수 있다.


이론적인 내용 은 위정도 까지 정리할 수 있을 것 같다.
내용적으로 있어 난해하거나 어려운점은 크게 없었다.

하지만 어떻게 적용해야 잘 사용할 수 있을지?
웹브라우저 동작에 어떻게 활용할지?
자료구조를 공부하면서 예제들을 잘 생각해보면서
내용을 상기시켜야겠다.

오늘은 이론 공부시간은 조금 적었고
Stack과 Queue관련 알고리즘 문제를 푸는 시간이 주를 이뤘고
문제를 풀면서 내가 정말 이해한건 맞지만
사용을 잘 못하고 있구나라는 꺠달음을 얻고 간다..


오늘의 커피량: ☕️ ☕️ ☕️ ☕️
오늘의 점심: 라면