인프런 커뮤니티 질문&답변
선언과 정의를 분리하는 이유가 뭔가요?
해결된 질문
작성
·
1.5K
0
강의 8:27부터 말씀하시는 이유만으로는 선언과 정의를 굳이 왜 분리하는지 잘 모르겠습니다.
이런식으로 " - " 버튼을 통해서 정의를 숨겨버리면, 정의를 따로 분리하지 않아도 한눈에 보기 편하지 않나요?
헤더를 쓰는 이유는 메인 코드를 간결하게 하기 위함 아닌가요?
선언과 정의를 분리하여 헤더까지 간결하게 만드는 이유가 궁금합니다.
답변 2
5
일단 예전에는 숨김 버튼이 없었는데, 지금 이 질문은 IDE의 성능에 따라 프로그래밍 방식도 함께 발전되어가는 현상을 보여주는 것 같습니다. 그러나 Visual Studio 기능을 믿고 코딩 스타일을 결정하시는 것을 바람직하다라고 말씀드리기는 애매한 면이 있네요.
최근에는 헤더에 모든 내용을 다 넣어두고 cpp는 아예 없는 라이브러리들도 꽤 나타나고 있습니다. 이런 경우의 장점은 헤더 파일만 복사해서 include 해주면 가져다 사용하기가 쉽겠죠. 단점은, 큰 라이브러리의 경우 빌드 시간이 길어집니다. 헤더와 구현이 분리되어 있는 라이브러리를 갖다 쓸 때는 보통 헤더와 미리 컴파일된 lib만 가져다 쓸 수 있습니다.
컴파일 할 때는 파일 단위(compilation unit)로 하기 때문에 한 파일 안에 너무 많은 내용이 들어 있으면 개발 단계에서 작은 수정만 하더라도 컴파일 시간이 길어질 수도 있습니다. 큰 라이브러리에서는 헤더는 하나를 쓰더라도 cpp를 여러 개로 쪼개놓는 경우도 있습니다. 극단적인 경우는 모든 함수의 구현을 모두 다른 cpp파일에 넣어두면 컴파일을 다시할 때 수정한 함수가 들어있는 cpp 파일 하나만 다시 컴파일하면 됩니다.
한 파일 안에서도 컴파일 새로 해야할 부분만 골라서 해주는 기능이 추가되고 있는 것으로 알고는 있는데 (심지어 디버깅 하다가 수정해서 다시 빠르게 실행해주는 기능) 아직 확인을 못해봤습니다.
0
선언과 정의를 분리하는 이유는
"컴파일러에게 이러한 함수가 있음을 미리 알려주기 위함"입니다.
아래와 같이 컴파일러가 어떤 함수인지 알기도 전에
해당 함수를 호출해버리면 컴파일러의 종류에 따라 오류가 날 수도 있습니다.
(Visual Studio와 같이 고급 컴파일러에서는 오류가 나지 않을 수 있지만,
원칙적으로는 아래와 같이 사용해서는 안됩니다.)
#include <stdio.h>
int main()
{
test();
return 0;
}
int test(void)
{
printf("hello.\n");
return 0;
}
그렇기 때문에 위 예시에서 test를 호출하기 전에,
test라는 함수가 있음을 알려주는 것이지요.
아래와 같이요.
#include <stdio.h>
int test(void);
int main()
{
test();
return 0;
}
int test(void)
{
printf("hello\n");
return 0;
}
- 를 이용해 코드를 접는 것은 IDE가 그저 보기 편하게 설정해주는 것이니
이와는 크게 관련이 없습니다.






음,,, 전방 선언을 통하여 이러한 함수가 존재한다는 것을 컴파일러에게 알려주는 것은 알고 있습니다.
강의에서 헤더파일에는 선언만 한 다음, 소스파일을 하나 새로 만든 후, 새로 만든 소스파일에 정의를 모두 타이핑 하시더라구요.
그리고 위와같은 과정을 거치는 것이 정석이라고 말씀하시기도 하였습니다.
헤더파일에서 선언과 정의를 분리하지 않고 그냥 사용했을 때 보다, 분리하여 사용하는 것이 무언가 이점이 있으니 정석이라 하신 것 일 텐데, 그 이점이 무엇인지 잘 모르겠어서 질문하였습니다.