배열의 경우, 메모리의 어떤 위치에서든지 접근(값의 읽기, 저장 등)이 가능하다.
하지만 이렇게 자유도가 높은 게 불편할 때가 있다.
바로 복잡한 프로그램을 만들기 위해 복잡한 알고리즘을 구현해나갈 때이다.
메모리에 직접적으로 접근이 가능하다는 말은 프로그래머가 모든 세부 단계를 명시적으로 처리해야 한다는 것을 의미한다.
이런 경우, 복잡한 알고리즘을 구현할 때 사용한다면 굉장히 코드가 길어지고 하나하나 처리해줘야 하기 때문에 불편할 것이다.
따라서 어떻게 자료구조가 작동하는지에 초점을 맞추는 게 아니라 어떤 기능을 하는지에 초점을 맞추는 추상화라는 개념이 필요하다.
그래서 우리는 추상화가 가능한 컨테이너(container)라는 자료구조가 필요하다.
추상화된 컨테이너는 복잡한 내부 구현을 숨기고, 더 직관적이고 단순한 인터페이스를 제공하여 프로그래머가 더 중요한 로직에 집중할 수 있도록 도와준다.
그 중 스택에 대해 배워보자.
먼저 우리가 '놀러 나가기'라는 행위를 위해서 숙제하기와 책상 정리하기를 먼저 해야한다고 생각해보자.
그럼 아래와 같은 구조가 될 것이다.

여기서 책상 정리를 하지 않고 숙제하기나 놀러 나가기를 먼저 할 수는 없다.
따라서 최종적으로 '놀러 나가기' 위해서는 아래와 같은 순서대로 일이 진행될 것이다.

이렇게 맨 마지막에 들어온 것이 맨 먼저 나가는 형태(LIFO(Last In First Out))의 자료 구조를 스택이라고 한다.
그럼 스택은 어떨 때 사용해야 할까?
ex)이진수 계산, 문자열 뒤집기 등등
출처: 홍정모 연구소