상세 컨텐츠

본문 제목

[iOS/Swift] 스택(Stack)과 스택 오버플로우란? 예제로 알아보기

Swift

by Mr.Garlic 2022. 2. 16. 04:13

본문

 

스택, 많이 들어보긴 했는데 이게 대체 뭘까요?

저와같은 비전공자들에게 아마 가장 어려운 것은 아마 생소한 전산학의 개념을 이해하는 것 이겠습니다. 

오늘은 스택과 스택오버플로우가 무엇인지 최대한 재미있게 이해해 보려고 합니다!

음,, 컴퓨터 네이놈,, 

프로그램의 작동 원리

스택이 뭐다! 라고 정의 내리기에 앞서서 프로그램, 메모리가 어떻게 동작하는지를 이해할 필요가 있습니다. 

 

우리가 에디터에 코드를 쓰면 컴파일이 되기 전에 이미 사전 처리를 하게 되어있습니다. 이때 대부분의 사전 처리는 헤더 파일과 관련이 있는데요. 스위프트에는 헤더 파일이 별도로 없다보니 생소한 개념이 되기는 합니다. 매크로나 상수등을 hash sign 으로 선언을 해 두는 과정인데요. 그 다음에 컴파일이 이루어지게 됩니다. 컴파일이 무엇인지는 또 다음 포스팅에서 자세히 다루도록 하겠습니다. 

 

컴파일을 하게 되면 우리가 human level에서 작성한 코드를 machine level code로 바꿔준다는 것은 일반적으로 알고 계시리라 생각합니다. 이진법으로 이루어진 그런 기계어 레벨로 바꿔주는거죠. 

 

그러면서 우리가 쓴 코드가 메모리 영역으로 이동하게 됩니다. 우리가 만든 변수들이 이때 메모리 영역에 저장이 되지요. 우리가 작성한 변수든 함수든 이 모든 코드가 메모리 영역에 배정됩니다. 이렇게 우리가 만든 모든 entity를 메모리 영역으로 옮기는 것을 로딩이라고 해요. 이 역할을 하는 것이 로더 입니다. 이 때 프로그램을 돌리는 메모리 영역을 Randon Access Memory, 즉 램이라고 우리가 부르는 그것입니다! 램은 몇 가지 세그먼트로 나눌 수 있는데요. 

 

첫번째 세그먼트는 머신 레벨의 코드를 저장하는 머신코드, 두번째는 스택, 그리고 으로 이 있습니다. 그 밖에 데이터나 free store 같은 부분이 있다고 하는데요. 오늘은 스택과 힙이 Ram 안에 있다~ 정도만 짚고 넘어가도 충분할 것 같습니다! 

그러니까 오늘 저희가 알아보려고 하는 스택은 RAM 안에 있는 세가지 세그먼트 중 한 부분이라는 것을 알 수 있겠죠??

여기까지 읽느라 고생하셨습니다! 그럼 이제 본격적으로 스택이 무엇인지 알아보도록 하겠습니다! 

 

스택이란 무엇인가? 스택의 정의

 

스택이 RAM에 있는 일종의 저장소 라는 것은 위의 작동 원리를 읽어보며 알 수 있었는데요. 스택은 지역 변수와 함수들을 주로 저장하는 곳 입니다. 지역 변수라는건 함수 내에 선언된 변수들을 말해요. 우리가 코드 내에서 이미 구현해 둔 것들을 저장하는 곳이기 때문에 이 스택은 앱을 실행시킨 상태에서는 더이상 메모리가 커지지 않아요. 이미 코드가 컴파일 되는 시점에 그 크기가 미리 결정되기 때문이예요. 우리가 이미 써놓은 코드를 옮기는 거니까 그 크기가 컴파일 이후에 커지지 않는것 이라고 이해를 했습니다. 컴파일 된 후에는 우리가 더이상 변수나 함수들을 고치진 않으니 말이예요.

 

그런데 이때 스택 메모리 안에 함수나, 변수들이 들어갈 때, 먼저 들어간 것보다 최근에 들어간 것이 더 먼저 사라지는 성질을 가지고 있어요. 이런 성질이 왜 있고, 어떤 결과를 가져오는지 같이 보겠습니다. 

 

스대감댁 골칫덩이, 스택 오버플로우란 대체 무엇일까?

우리가 매일 모르는 문제를 검색하는 그곳, 스택 오버플로우! 이것도 이름에 스택이 들어가는데... 대체 스택 오버플로우가 무엇일까?

의외로 간단하게 설명할 수 있어요.

무한히 반복될 수 밖에 없는 두 함수를 만들어 보았어요. (티스토리 코드블럭이 이상하네요, 아무리 들여쓰기 맞춰도 잘 안되는 ㅠㅠ)

func plus(a: Int) {
	if a == 0 {
    	return
    }
    a += 5
    plus(a)
}

func makeA() {
	let a: Int = 5
    plus(a)
}

makeA()

 

이러면 일단 스택에는 makeA 함수가 먼저 들어가게 될거예요. 그리고 makeA 함수 내의 plus라는 함수를 실행시키고 싶겠죠? 그때 plus도 스택에 들어갑니다. 스택이 긴 원통 모양이라면, 맨 밑에는 makeA가 들어가있고 그 위에 지금 plus가 들어와 있겠죠. 그러면 이제 plus를 실행시켜 줍니다. 그리고 나서 스택 메모리에서 사라져야하는데!!!! 

 

우리의 plus 함수는 아주 악랄하게도 a가 0이 될때까지 자기 자신을 계속 실행시키는 함수입니다... 끝이 안나겠죠 계속 더하기만 하는데...

그래서 스택에 무한히 plus함수가 계속 쌓이게 되죠... 

 

안타깝게도 우리의 컴퓨터는 용량이라는게 정해져 있다 보니까 이렇게 스택의 긴 원통에 계속계속 plus 함수가 들어오고 완료가 되어서 나가지는 않고, 이러면 어떻게 될까요???? 터지겠죠.ㅠㅠ 불쌍한 우리 맥북! 이것이 스택 오버플로우 입니다. 참 재밌죠?

 

 


다음 포스팅에서는 스택에 이어서 힙에 대해서도 알아보도록 하겠습니다! 

혹시 궁금하신 점이나 잘못 기재된 사항이 있다면 알려주시기 바랍니다! 

 

 

 

 

관련글 더보기