문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 스택(자료구조) (문단 편집) == 응용 == 구현이 쉬운 녀석이 응용할 건덕지도 매우 많다. 예를 들어서 [[함수(프로그래밍)|함수]]가 함수를 호출하거나 [[재귀함수|자기 자신을 호출하는 것도]][* 재귀함수는 함수 내에서 자기 자신을 계속해 호출하기 때문에 종료조건을 잘 설정해주지 않으면 빠져나오지 못해 프로그램에 심각한 문제가 생긴다. 그러한 문제와 가독성의 이유 때문에 많이 쓰지 않는 편이다. 대부분의 재귀함수는 반복문으로 치환하여 사용하는 것이 가능하며, 많은 때에 쓰기도 알아보기도 쉬운 반복문이 더 효율적이다. 하지만 [[하노이의 탑]]과 같은 몇몇 문제에서는 재귀함수를 이용하여 해결하는 것이 더 간단해서 재귀함수가 보편적으로 사용된다.] 스택에 기반을 두고 있다. 비전공자가 가장 와닿는 영역은 [[undo]]. 그러니까 Ctrl + Z. 가장 최근에 실행한 명령어를 취소해야하기 때문에 마지막에 들어간 자료가 먼저 나오는 스택 구조가 효율적이다. 대부분의 현대 [[CPU]]는 [[어셈블리어]]에 스택 영역을 제어하는 명령이 있다. 한 프로그램이 사용하는 스택 영역은 기본적으로 크기가 고정되어 있다.[* 이 스택은 정적 할당되므로 런타임 환경에서 변경하는것이 불가능하며 컴파일시 이 스택 크기를 지정하여야 한다. 예를 들어 MSVC의 기본 스택 크기는 1MB이며 [[https://docs.microsoft.com/en-us/cpp/build/reference/f-set-stack-size?view=msvc-170|{{{/F}}}]] 옵션을 통해 이 크기를 변경할 수 있다.] 실행되거나 기다리고 있는 여러 함수 등 각 분기점에서, 함수에서 사용되는 변수와 같은 정보를 이러한 명령어를 통해 추가하고 삭제한다. 이를 이해하지 못하고 스택 영역 변수나 메모리를 함부로 사용하면 잘못된 데이터가 씌워져 이상한 값을 출력하거나 문제를 일으킬 수 있다. 이를 좀더 쉽게 설명해보자. 어떤 [[함수(프로그래밍)|함수]]든 호출되는 순간 스택에 그 함수를 위한 영역(스택 프레임 stack frame)이 할당되는데, 어떤 함수 foo()가 호출된 상태에서 foo()가 다시 다른 함수 bar()를 호출하는 상황을 생각해 보자. 우선 스택 내부 foo()에 해당되는 프레임에 데이터가 쌓여 있을 것이다. bar()가 호출되면 우선 bar가 받는 인수들이 푸시 되고, 그 다음 bar의 리턴값을 받을 공간이 푸시 된다. 그 위로 bar에 해당하는 새로운 스택 프레임이 할당되고, 그 프레임 내부에 bar의 내부 변수들이 푸시 된다. 그런 뒤 bar에 해당하는 연산이 종료되고 bar의 스택 프레임 내부의 값들이 하나씩 빠져나오면서 끝으로 출력 데이터가 리턴값을 받기 위한 공간으로 들어오게 된다. 다시 말해 함수가 호출될 때마다 스택에 값들이 쌓이고, 계산이 끝나면 다시 하나씩 빼면서 출력값이 가장 밑에 있던 리턴 공간으로 돌아오는 것이다. 이 개념을 잘 이해하면 재귀가 연산속도에서 불리한 점이 발생함을 알 수 있다. 재귀도 일반 함수 호출과 다를 것 없이 한번 재귀 호출이 이루어질 때마다 계속 스택을 쌓아나가므로 최종 결괏값을 되돌려 받으려면 쌓인 스택을 전부 다시 빼내야 하기 때문이다. 따라서 [[재귀함수|재귀 알고리즘]]을 사용할 때는 반드시 재귀 알고리즘이 필요한지 설계를 먼저 정확히 하는 것이 중요하다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기