• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

선언과 정의를 분리하는 이유가 뭔가요?

22.08.12 17:20 작성 조회수 920

0

강의 8:27부터 말씀하시는 이유만으로는 선언과 정의를 굳이 왜 분리하는지 잘 모르겠습니다.

이런식으로 " - " 버튼을 통해서 정의를 숨겨버리면, 정의를 따로 분리하지 않아도 한눈에 보기 편하지 않나요?

 

헤더를 쓰는 이유는 메인 코드를 간결하게 하기 위함 아닌가요?

선언과 정의를 분리하여 헤더까지 간결하게 만드는 이유가 궁금합니다.

답변 2

·

답변을 작성해보세요.

4

일단 예전에는 숨김 버튼이 없었는데, 지금 이 질문은 IDE의 성능에 따라 프로그래밍 방식도 함께 발전되어가는 현상을 보여주는 것 같습니다. 그러나 Visual Studio 기능을 믿고 코딩 스타일을 결정하시는 것을 바람직하다라고 말씀드리기는 애매한 면이 있네요.

최근에는 헤더에 모든 내용을 다 넣어두고 cpp는 아예 없는 라이브러리들도 꽤 나타나고 있습니다. 이런 경우의 장점은 헤더 파일만 복사해서 include 해주면 가져다 사용하기가 쉽겠죠. 단점은, 큰 라이브러리의 경우 빌드 시간이 길어집니다. 헤더와 구현이 분리되어 있는 라이브러리를 갖다 쓸 때는 보통 헤더와 미리 컴파일된 lib만 가져다 쓸 수 있습니다.

컴파일 할 때는 파일 단위(compilation unit)로 하기 때문에 한 파일 안에 너무 많은 내용이 들어 있으면 개발 단계에서 작은 수정만 하더라도 컴파일 시간이 길어질 수도 있습니다. 큰 라이브러리에서는 헤더는 하나를 쓰더라도 cpp를 여러 개로 쪼개놓는 경우도 있습니다. 극단적인 경우는 모든 함수의 구현을 모두 다른 cpp파일에 넣어두면 컴파일을 다시할 때 수정한 함수가 들어있는 cpp 파일 하나만 다시 컴파일하면 됩니다.

한 파일 안에서도 컴파일 새로 해야할 부분만 골라서 해주는 기능이 추가되고 있는 것으로 알고는 있는데 (심지어 디버깅 하다가 수정해서 다시 빠르게 실행해주는 기능) 아직 확인을 못해봤습니다. 

0

강민철님의 프로필

강민철

2022.08.13

선언과 정의를 분리하는 이유는

"컴파일러에게 이러한 함수가 있음을 미리 알려주기 위함"입니다.

 

아래와 같이 컴파일러가 어떤 함수인지 알기도 전에 

해당 함수를 호출해버리면 컴파일러의 종류에 따라 오류가 날 수도 있습니다.

(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가 그저 보기 편하게 설정해주는 것이니

이와는 크게 관련이 없습니다.

전종운님의 프로필

전종운

질문자

2022.08.13

음,,, 전방 선언을 통하여 이러한 함수가 존재한다는 것을 컴파일러에게 알려주는 것은 알고 있습니다.

강의에서 헤더파일에는 선언만 한 다음, 소스파일을 하나 새로 만든 후, 새로 만든 소스파일에 정의를 모두 타이핑 하시더라구요.

그리고 위와같은 과정을 거치는 것이 정석이라고 말씀하시기도 하였습니다.

 

헤더파일에서 선언과 정의를 분리하지 않고 그냥 사용했을 때 보다, 분리하여 사용하는 것이 무언가 이점이 있으니 정석이라 하신 것 일 텐데, 그 이점이 무엇인지 잘 모르겠어서 질문하였습니다.