콜 스택(Call Stack)?

1

개념정리

목록 보기
8/10
post-thumbnail

자이로마이트, 스택-업을 해라. 인간.

위키백과에서 찾은 콜 스택

위키백과 콜 스택 링크

읽어보시라. 이해가 안되는건 아니지만, 나는 이걸로 잘 설명할 자신이 없다.

MDN에서 찾은 콜 스택

MDN 용어사전 - 호출 스택 링크

여기는 '호출 스택' 이라는 이름으로 적혀있다.
굉장히 알기 쉽게 적혀있어서 이 정도의 글이라면 쉽게 이해할 수 있는 수준으로 적혀있다.

글의 내용을 요약해보자면

  • 함수를 실행하면 콜스택이 1개 쌓인다.
  • 함수 내에서 또 다른 함수를 실행하면 콜스택이 1개 더 쌓인다.
  • 함수가 종료되면 함수 자신이 만든 콜스택이 줄어든다.

Stack Overflow?

"오오! 나 알아! 스택오버플로! https://stackoverflow.com/ 여기 맞지?!"

아쉽지만 아니다.
위키백과 스택 오버플로 링크

쉽게 설명하자면 콜 스택이 수용할 수 있는 한계를 넘어가면 에러가 나는 것이다.

예를 들면 10개의 콜 스택을 수용할 수 있는데,
함수를 11개 실행시켜 콜스택이 11개가 되면 실행할 수 있는 한계를 넘어서 폭발하는 것이다.

언제 스택 오버플로가 생기지?

개인적인 경험을 미루어 보았을 때 주로 반복문이나 재귀함수에서 발생한다.
좀 더 자세히 설명하자면 몇번 반복할지 파악하기 어려운 상황이거나,
너무 많이 반복해야 함을 알고있는 상황일 때 그렇다.

재귀함수의 경우 꼬리재귀호출을 사용하면 되는데, 자바스크립트의 경우에는 아직 지원하지 않아서 재귀 한번당 콜 스택이 하나씩 늘어난다.
반복을 엄청나게 많이 할 것으로 예상되면 해당 로직을 함수에 담아서 깔끔하게 실행하기 보단 좀 너저분해도 반복문 안에 쑤셔넣어야 하는 경우도 있다.


주...죽여줘...

그럼 콜 스택을 줄이는 방향으로 코드를 작성해야겠네?

그렇기는 하지만 맹목적으로 콜 스택을 줄이는 방향으로 코드를 작성하면 안된다.
함수와 메서드는 우리가 기대하는 행위를 단순화 시켜주는 역할을 한다.

예를 들면 어떤 문자열을 암호화 하기 위해서는

  • 암호화 해주는 라이브러리를 호출해서 초기화 한 뒤
  • 그 초기화한 값에 암호화 할 문자열을 넣어주고
  • 어떤 방식으로 암호화 할지 결정해야 한다

이렇게 3줄로 표현해야 하지만 이걸 함수로 표현한다면

  • 암호화 해주는 함수(암호화 할 문자열)

이렇게 간단하게 표현이 가능해지고 재사용도 가능해진다.
그리고 현대에 생산되는 기계들은 컴퓨팅 파워가 좋아져서 위에서 언급한 특수한 상황의 반복문이나 재귀가 아니라면
스택오버플로가 발생하기는 쉽지 않다.
(엄청 열악한 사양의 임배딩 기기라면 말이 다르겠지만.)

개인적인 의견

콜 스택을 줄이는 고민을 하는건 좋지만, 그것 때문에 가독성이 떨어지는 코드로 가야 할 필요는 없다.
콜 스택이 하나 늘어난다고 코드를 실행하다가 터지지는 않는다.

"서버에 요청이 많이 올 걸 대비해서 콜 스택을 줄여야 하지 않나?"

라고 생각 할 수도 있는데, 그렇게 요청이 많이 와서 서버가 견디지 못할 정도가 된다면
콜 스택을 줄이는 방향으로 길게 작성한 코드도 견디지 못하기는 마찬가지 일 것이다.

함수와 메서드로 잘 포장하여 협업자들과 잘 소통할 수 있고 유지보수 하기 용이한 코드가 좋을 것인가,
콜 스택을 하나라도 더 줄여서 몇번의 요청을 더 견딜 수 있는 코드가 좋을 것인가

어떤게 더 좋을지 생각해보시길 바란다.

profile
지상 최강의 개발자 쥬니니

0개의 댓글