본문 바로가기
C++/기초

C++ 기초 : 분할 구현

글: 시플마 2024. 3. 6.

아래와 같이 구현하면 

오류가 발생합니다.

 

이유가 뭘까요?

 

 

하단에 표시되는 오류 목록에서

코드를 보니 'C3861'입니다.

오류 코드가 C로 시작하는 거 보니

컴파일 과정에서 발생하는 오류네요.

Test 식별자를 찾을 수 없다고 합니다.

 

 

컴파일러는 위에서부터

아래로, 순차적으로

컴파일을 진행합니다.

 

main 함수에서 Test 함수를 호출했는데

Test 함수를 호출하기 전, 위 코드에서

Test 함수를 검사한 적이 없습니다.

물론 main 함수 밑에 Test 함수가 정의되어 있지만,

Test 함수 호출 시점에서는 정의되었는지 모르기 때문에

오류가 발생하는 것이죠.

 

 

그렇다면 이번에는 이렇게 해볼까요?

 

main 함수 위에 void Test(); 라는 코드를 넣었습니다.

그러자 잘 작동합니다. 사용하고자 하는 함수를

선언만 하고 호출한 이후 시점에 정의해주어도

컴파일 과정에서 오류가 발생하지 않습니다.

 

 

컴파일 과정에서 오류가 발생하지 않았지만

분명 main 함수에서 Test 함수가 호출될 때

Test 함수의 내용을 모르는데 어떻게 잘 작동하는 걸까요?

 

바로 '링크'라는 과정 덕분입니다.

Test 함수가 선언이 되기만 했다면

Test 함수를 호출하는 코드를 만났을 때

컴파일 과정에서 오류가 발생하지 않습니다.

이후 링크 과정을 통해 선언만 된 Test 함수가

실제로 정의된 부분을 찾아 연결하여 실행합니다.

 

그래서 Test 함수의 정의 부분을

주석 처리하여 다시 실행하면

 

오류가 발생합니다.

오류 코드는 'LNK2019'와 'LNK1120' 입니다.

오류 코드의 앞부분이 LNK, 즉 LINK를 의미하고 있고

이는 컴파일 과정에서 Test 함수의 선언을 확인하여

문제없이 넘어갔지만 링크 과정에서 Test 함수의 정의를

찾을 수 없어 오류가 발생했다는 것을 알 수 있습니다.

 

 


 

 

지금까지는 모든 함수의 선언, 정의, 호출을

모두 하나의 파일에서 진행하였습니다.

이를 분할하여 정리하지 않으면

작은 프로그램에서는 문제가 되지 않지만

나중에 프로그램이 커져 코드가 길어지면

가독성이 떨어지고 유지보수하기 곤란해질 겁니다.

 

만약 다른 동료가 "플레이어와 관련된 함수 어디 있어?"라고

물었을 때 "35640번째 줄부터 40000번째 줄까지야."라고

하면 위치를 외우기도, 코드를 찾기도 힘들어 곤란하겠죠?

 

이러한 이유로 분할 구현을 합니다.

Test 함수의 선언과 정의, 호출을 따로 했던 것처럼

하면 되는데 선언, 정의, 호출을 각각 다른 파일에 할 겁니다.

 

이번에는 두 수를 받은 후

두 수를 더해 반환하는 Add 함수를 만들어 봅시다.

 

솔루션 탐색기에서

'소스 파일' 폴더에 함수를 정의할 func.cpp 라는 항목을 만들고

'헤더 파일' 폴더에 함수를 선언할 func.h 라는 항목을 만들었습니다.

main.cpp는 Add 함수를 호출할 main 함수가 있는 항목입니다.

 

새로운 항목을 만드려면 단축키 

'Ctrl + Shift + A'를 누르면 됩니다.

 

 

func.h에서 Add 함수를 선언합니다.

 

 

 

func.cpp에서 Add 함수를 정의합시다.

 

전처리기 지시문인 #include 지시문을 사용하여 

func.h 파일을 찾아 참조합니다. 

#include "func.h"를 하면 전처리기 지시문에 

func.h의 내용이 붙여넣기 된다고 생각하면 됩니다.

 

 

 

이제 main.cpp에서 Add 함수를 호출합니다.

 

main.cpp에서도 전처리기 지시문인

#include 지시문을 통해 func.h 파일을 찾아 참조합니다.

 

Add 함수를 이용하여 1과 2를 더한 결과인 3이

변수 data에 잘 대입된 것을 확인할 수 있습니다.

 

 


 

 

 

main.cpp가 아닌 다른 cpp에서도

Add 함수를 사용하고 싶다면 #include "func.h"만

넣어 참조하면 Add 함수를 사용할 수 있습니다.

 

 

또한 func.h와 func.cpp 파일에 덧셈 함수뿐만 아니라

뺄셈, 곱셈 함수를 추가한다고 합시다.

#include "func.h"로 func.h를 참조한 모든 파일에서

뺼셈, 곱셈 함수도 사용할 수 있게 되는 것입니다.

 

 

 


 

 

 

 

물론 하나의 파일에 모든 함수를 선언, 정의, 호출을 하면

속도가 더 빠르긴 합니다. 하지만 그럼에도 정리하여

코드를 작성하는 게 협업과 유지보수 면에서 좋겠죠.

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB


 

 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 정적 변수와 외부 변수  (0) 2024.03.29
C++ 기초 : 분할 구현의 문제점  (0) 2024.03.22
C++ 기초 : 지역 변수 / 전역 변수  (0) 2024.03.05
C++ 기초 : 구조체  (0) 2024.03.03
C++ 기초 : 배열  (0) 2024.03.02