C++ (9) - 분할 구현
본 내용은 어소트락 무료 강의 <C/C++ 무료강의>을 기반으로 공부한 내용을 정리한 것이다. 틀린 내용이 있을 수도 있음.
분할 구현
Header 파일(파일명.h)과 Cpp 파일(파일명.cpp)를 분리하여 각각에 구현하는 것
분할 구현 순서
- Header 파일을 추가하고 원하는 함수를 “선언”만 하기
// func.h 파일 내 코드
#Pragma once // Header 파일이 중복 선언되지 않게하는 전처리기
int Add(int a, int b) // 덧셈 함수
int Sub(int a, int b) // 뺄셈 함수
int Mul(int a, int b) // 곱셈 함수
- Header 파일에서 “선언”만 했던 함수를 Cpp 파일에서 “구현”
// func.cpp 파일 내 코드
#include "func.h" // #include 전처리기로 Header 파일 불러오기
int Add(int a, int b) // Cpp 파일에서 Header파일의 "선언"만 되었던 함수를 "구현"
{ // 이 과정이 우리가 여태 한 파일에서 맨 앞 코드에서 함수를 선언하고 구현했던 것과 같다.
return a + b;
}
int Sub(int a, int b) // Cpp 파일에서 Header파일의 "선언"만 되었던 함수를 "구현"
{
return a - b;
}
int Mul(int a, int b) // Cpp 파일에서 Header파일의 "선언"만 되었던 함수를 "구현"
{
return a * b;
}
-
이제 원하는 함수를 사용해야 하는 Main 파일에서 함수 사용가능 ```cpp int main() { int Data1 = Add(10,20); int Data2 = Sub(10,20); int Data3 = Mul(10,20);
return 0;
} ```
함수의 선언과 구현을 분리하여 저장 -> 저장된 함수명만 Main 파일에서 사용한다.
분할 구현의 원리
-
Header 파일에서 함수 선언
-
Cpp 파일에서 함수 구현
-
Main 파일에서 함수를 호출 -> 문법적으로 오류는 없기에 컴파일에러는 발생 X, 그러나 호출당한 함수가 존재하지 않는다면 링크 에러 발생
-
호출당한 함수가 어딘가에 구현되어 있어야 함. 구현되는 곳은 어느곳이든 상관없이 존재하기만 하면됨. 그래야 링크단계에서 합쳐질 수 있다.
-
호출당한 함수를 찾아내면 링크단계에서 파일들이 합쳐져 프로그램 실행을 위한 .exe 파일이 되어 실행됨.
분할 구현의 장점
-
관련함수를 카테고리 별로 구현만 해놓고 해당 파일만 전처리기를 통해 참고하면 함수를 사용 가능.
-
코드 관리가 용이하다. 만약 분할 구현을 하지 않고 한 파일에 함수 선언, 구현을 모두 담는다면 관리가 힘들다.
분할 구현의 문제점
그러면 Header 파일에 선언하고 구현까지 동시에 해버리면 안될까? -> 안됨 여러개의 Cpp 파일에서 전처리기 #include를 통해 함수가 복/붙이 되면 컴파일 이후 링크단계에서 exe파일로 합쳐졌을 떄 함수가 중복되어 오류가 발생
전역변수도 동일하다. 메인함수 내의 전역변수를 사용해서 전체 코드를 구현하면 전역변수를 컴파일러가 확인하고 사용할 수 있지만 다른 파일에서 해당 전역변수를 인식하지 못함. exe파일로 합쳐지면 데이터 영역에는 해당 전역변수가 존재한다. 즉, 내가 선언한 전역변수를 다른 쪽 파일에서 문법적으로 인식시키가 어렵다.
해결법이 있다?
만약 헤더파일에 전역변수를 지정한다면? 이는 함수의 중복과 동일하게 전역변수의 중복이 발생 데이터 영역 내에서 전역변수가 중복된다면 호출 시 어떤 전역변수를 해야 할 지 모른다.
이를 해결하기 위한 개념이 바로 정적변수와 외부변수이다.