Q & A
함수 실행이 끝나면 왜 함수 안에 선언된 변수가 사라지나요?
컴퓨터에서는 지역 변수를 선언하고, 함수를 호출할 때 스택을 사용하기 때문입니다. 스택은 접시 쌓기에 비유할 수 있는데요. 접시를 순서대로 아래에서 위로 쌓고, 위에서부터 꺼내 쓸 수는 있지만 중간부터 빼서 쓸 수는 없는 규칙이 있습니다.
함수를 호출하면 접시를 하나 쌓습니다. 그리고 함수 안에서 변수를 선언할 때마다 접시를 계속 쌓게 됩니다. 만약 함수가 끝나면 함수 부분에 해당하는 접시만 중간에서 뺄 수 없기 때문에 위에 있는 변수부터 차례대로 꺼낸 뒤 함수를 꺼냅니다. 이런 규칙 때문에 함수 안에 선언된 변수는 함수가 끝나면 사라지게 됩니다.
함수 실행이 끝나도 사라지지 않는 변수도 있나요?
정적(static) 변수가 있습니다. 정적 변수는 스택을 사용하지 않으며 메모리에서 계속 유지되기 때문에 함수가 끝나도 사라지지 않습니다. 따라서 함수에서 정적 변수는 & (주소 연산자)로 메모리 주소를 반환해도 됩니다.
void hello(void)와 void hello()의 차이점은 무엇인가요?
void hello(void)처럼 함수의 매개변수 부분에 void 하나만 들어가면 매개변수가 없다는 뜻입니다. 그리고 void hello()는 매개변수 목록이 정의되지 않았다는 뜻입니다.
void hello(void); // 매개변수가 없음 void hello(); // 매개변수 목록이 정의되지 않음
여기서는 void hello(void)가 C 언어 표준에 맞는 정확한 표기입니다. 하지만 대부분 void hello()와 같이 사용하고 있고, void를 생략해도 특별한 문제는 없습니다.