stack에서 push가 변수에 값을 대입한단 뜻인가요??

dbsthqkf의 이미지

push와 pop이 넣고 뺀다는 거라는데
도대체 넣고 뺀다는게 정확히 뭐죠..?
int buf[5] = 3;
라고 하면 buf라는 stack 메모리에 3이라는 integer를 push하는게 맞는건가요?
그렇담 여기서 pop은 어떻게 하는건가요?

kese111의 이미지

stack 에 대한 정의부터 내리시는게 먼저인듯
wiki 참고요 - http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D

dbsthqkf의 이미지

stack에 대한 정의는 나름 찾아본다고 찾아봤는데 ㅠㅠ
LIFO구조고 지역변수 선언시 stack에 메모리가 할당된다~
뭐 등등 이런 이론적인 것들만 되어있어서
실제적으로 push와 pop이라는게
코딩을 구현하는 과정 중 어느부분일까 궁금해서요 ^^
답변 감사합니다!!

익명 사용자의 이미지

stack은 LIFO 구조를 말합니다.
Last In First Out. 마지막 들어온게 처음 나간다는 뜻이죠.
전역 변수가 아닌 지역 변수의 경우에 stack에 저장하는게 맞기는 한데,
stack을 만들고 push하는 것은 사람이 일일이 하는게 아니라 기계적인 매카니즘으로 자동으로 됩니다.
int buff[5]는 stack에 5개의 int공간을 넣어(push)라는 뜻이고,
buff[0] = 3은 buff중에서 첫번째 공간에 3을 써넣어(assign)라는 뜻입니다.
pop은 지역변수가 사라질 때 역시 기계적으로 자동으로 됩니다.

즉, 설명하신 구문에서만 따지자면 push되고 pop되는 것은 "메모리 공간"이지 "값"이 아닙니다.

dbsthqkf의 이미지

감사합니다!!
그럼 프로그래머가 push(변수선언, 함수호출 등) push는 할수있지만
이러한 것들을 인위적으로 pop할 수 있는것이아니라 함수가 끝나면 자동으로 pop된다는 거죠? ^^

jick의 이미지

자료구조에서 "스택"이라고 하면 데이터를 접시처럼 차곡차곡 쌓아놔서 (이런 걸 영어로 stack이라고 하죠...) 가장 마지막에 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조를 스택이라고 합니다.

그런데 함수가 다른 함수를 호출하다 보면 결국 가장 마지막에 불린 함수가 가장 먼저 끝나기 때문에 이 함수들이 사용해야 할 로컬 변수를 저장하는 공간도 스택과 비슷한 방식으로 쓰이게 됩니다.
그래서 이렇게 "함수들의 지역 변수를 저장하는 공간"도 스택이라고 불립니다.

그런데, 첫번째의 스택과 두번째의 스택은 사용 방법이 비슷하지만 성격이 좀 다릅니다. 첫번째 스택은 "자료구조"로서의 스택이고, 두번째 스택은 그냥 프로그램이 동작하는 데 필요한 연속된 메모리 공간을 스택이라고 부르는 것입니다.

그래서 이 둘을 구분 안 하고 섞어쓰면 헷갈리기 시작합니다. 이를테면 "함수가 시작할 때 스택에 push를 어떻게 하나요?" 같은 질문은 그냥 "함수가 시작할 때 스택 가장 끝에 자기가 필요한 만큼 공간을 할당한다" 이렇게 이해하시는 게 좋습니다. 이 스택은 자료구조가 아니므로 굳이 push/pop 연산을 끌어들일 필요가 없습니다.

* 힙(heap)도 마찬가지로 자료구조로서의 힙과 "메모리를 동적 할당할 수 있는 공간"으로서의 힙은 전혀 다른 놈이죠. (이 경우는 심지어 비슷하지도 않습니다.)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.