안선생의 개발 블로그
C++ 분할구현 본문
분할구현: 헤더랑 파일을 구별하는 것
분할구현하는 이유는 하나의 프로그램을 만들 때 메인 소스파일에다가 다 만들면 코드가 많아져 보기 힘들어짐 그래서 각 기능별로 분할로 나눈다.
헤더 파일을 일단 하나 만들기
b.h라는 헤더파일을 하나 만들었다. 저 코드의 뜻은 add라는 함수가 어딘가의 있다라는 뜻이다. 그러면 add라는 함수의 구현은 어디있는가?
그것은 소스파일 a.cpp에 있을 수도 있고 main.cpp에 있을수도 있다. 우리는 분활로 구현할것이니 a.cpp의 구현을 해보자
a.cpp소스 파일이다. #include "b.h"는 쉽게 말하면 b.h헤더 파일을 a.cpp의 복붙한다고 생각하면 된다. 즉 b.h의 add함수가 있어요 라는 코드가 a.cpp에도 있다고 생각하면 쉽다. a.cpp는 add함수의 기능을 구현한것이다.
기능을 구현한것을 main()함수에서 써보자
그러면 마찬가지로 b.h헤더파일을 참조해주고 add()함수를 호출하면 3인 출력된다. 이게 왜 가능하냐면 컴퓨터가 링크과정을 통해 자동으로 소스를 연결 해주기 때문에 가능하다. 즉 컴퓨터가 소스파일을 다 보면서 add함수를 호출하면 이게 어디있지 하고 소스파일 전부를 찾는다. 그리고나서 a.cpp에 있는 add()함수 구현기능을 컴퓨터가 찾아서 main()함수에서 기능을 쓸 수 있게 컴퓨터가 자동으로 해준다.
즉 헤더에서는 함수가 있다고 선언을 해주고 a.cpp(다른소스파일)에서는 기능을 구현해주고 main.cpp()에서는 기능을 사용한다. 이렇게 하면 나중에 코드의 가독성이 좋아진다 또 코드를 손쉽게 관리할 수 있다.
만약에 main()함수의 모든 코드를 쓰면 main()함수에 코드가 말도 안되게 많아진다. 만약에 누군가 "??함수 어딨어요?" 라고 물으면 "아 그거는 main()함수 1,000번째 줄에 있어요"라고 할 수 없기 때문에 분활해줘서 코드를 손쉽게 관리하도록 하자.
그런데 나는 의문이 생겼다. 헤더파일에서 기능 까지 구현을 하면 되지 않을까?
만약 그렇게 되면 이런 오류가 뜬가
이유가 무엇이면 우리가 만든 a.cpp소스와 main.cpp소스에 add()함수가 두개가 만들어져서 발생하는 오류이다. 쉽게 생각하면 두 소스는 b.h헤더파일을 참조하는데 b.h헤더파일에는 add()함수라는 기능이 만들어져있다고 생각해보자 그러면
b.h를 참조하는 두 소스파일에 add()라는 함수가 각각 하나씩 만들어지게 되는것이다.
두 소스파일의 #include "b.h"는 쉽게 말하면 b.h헤더 파일을 복붙한다고 생각하면 되는데 두 소스파일에 add()함수가 각각 복붙되서 저런에러가 뜨는것이다. 그런한이유로 헤더파일과 소스파일을 나눠줘야 한다.
그러면 분활구현의 단점은 없는가?
분활구현을 하면 전역변수를 쓰기 애매해진다.
내가 만약
a.cpp소스파일에서 i라는 전역변수를 선언해보자 그리고 이것을 main.cpp의 main()함수에서 쓸라고하면
빨갛게 에러가 뜨는걸 볼 수 있다. 그 이유는 i라는 전역변수를 main.cpp에서는 찾아볼 수 없기 때문이다.
그러면 나는 코드를 쉽게 관리할려고 분활 구현을 했는데 내 전역변수를 쓸 수 없네 그러면 분활구현을 왜 하지? 라는 생각을 할 수 있다. 그럴 때 쓰는게 외부변수이다.
외부변수와 정적변수는 다음글에서 배워보자.
'C++' 카테고리의 다른 글
C++ 포인터 (0) | 2022.06.03 |
---|---|
C++ 정적 변수 & 외부 변수 (0) | 2022.06.01 |
C++ 지역변수,전역변수 (0) | 2022.05.30 |
C++ 구조체 (0) | 2022.05.30 |
C++ 배열 (0) | 2022.05.30 |