코드의 유지보수 차원에서 분할 구현이 좋다. main함수에서 모든 것을 처리하면 코드가 장황해지고 코드의 가독성이 떨어지게 된다. 이를 보완하기 위해 분할구현을 한다.
분할구현을 하면 함수를 사용할때 함수의 선언과 함수의 구현부분을 분리하여 다른 cpp파일에서는 비즈니스로직을 신경쓰지 않아도 되는 장점이 있다.
분할구현을 사용하려면 먼저 헤더파일을 생성해야한다.
헤더 파일에는 단순 함수의 선언부 만 만든다.
int Add(int num1, int num2);
int Divide(int num1, int num2);
다음 함수를 구현하는 cpp파일에서는 헤더파일을 불러오고 각각의 함수를 정의한다.
//헤더 파일 불러오기
#include "function.h"
// 각각의 함수 정의하기
int Add(int num1, int num2){
return num1 + num2;
};
int Divide(int num1, int num2){
return num1 / num2;
};
사용하고자 하는 cpp파일에서는 헤더파일을 불러와 각각의 함수를 사용하면 된다.
#include <iostream>
using namespace std;
#include "function.h"
int main(){
//헤더에서 선언된 선언부에 의해 에러가 발생하지 않는다.
//파일이 링크되어 함수를 읽을 수 있게된다.
// Add함수 사용
cout << Add(2, 3) << endl; // 5
// Divide함수 사용
cout << Divide(4, 2) << endl; // 2
return 0;
}
전역변수와 정적변수의 가장 큰 차이점은 정적변수는 각각의 파일별로 선언 때마다 변수명은 같아도 다른 주소값을 가져 생성이 가능하지만 전역변수는 각각의 파일별로 같은 이름을 가진 변수는 생성할 수 없다. 전역변수는 파일들이 링크가 되는 순간 변수명 중복으로 인하여 링크에러를 발생시킨다. 반면, 정적변수는 생성할때마다 같은 이름의 변수명이라도 다른 주소에 할당한다.
정적변수의 가장 큰 특징은 데이터 영역에 값이 할당되어 프로그램 종료 시 까지 유지되는 전역변수의 특징을 가지고 있으면서 선언하는 위치에 따라 다른 사용자의 접근을 방지하여 오류를 예방하는 효과를 가질 수 있다.
void Test1() {
//함수 안에서 선언된 정적변수는 함수 안에서만 사용이 가능하다.
//static 변수는 선언 시 초기화. 최초 선언 후 프로그램 종료시까지 유지됨.
static int g_i = 0;
g_i++;
int l_i = 0;
l_i++;
cout << "함수 정적변수" << g_i << endl;
cout << "함수 지역변수" << l_i << endl;
}
int main() {
Test1();
g_i; // 해당 Test1의 함수에서 선언된 정적변수에 접근 할 수 없다.
return 0;
}
헤더에 정적변수를 생성해보자
static int s_g_i = 0;
해당 파일에 정적변수를 불러와보자
#include "common.h"
int Add(int num1, int num2) {
//주소값 출력
cout << "common 헤드의 정적변수" << &s_g_i << endl;
return num1 + num2;
}
메인함수에서 variable.cpp와 헤더를 불러와보자
#include "common.h"
int main() {
//함수를 실행하도록 하면 해당 정적변수의 주소값을 출력할 수 있다.
cout << Add(2, 3) << endl;
// Add 함수의 정적변수와 주소값이 다르다.(서로 다른 변수임)
cout << "common 헤드의 정적변수" << &s_g_i << endl;
return 0;
}
위와 같이 메인함수에서의 정적 변수와 variable파일의 Add함수의 정적변수 s_g_i변수의 주소값은 서로 상이한 것을 알 수 있다.
즉, 헤더는 단순히 각 파일에 불러온 위치에 복사해서 붙여넣는 식이기에 정적변수의 특징에 따라 생성 시마다 다른 주소값이 할당되어 서로 상이한 포인터를 가지게 된다.
모든 파일에서 공통으로 사용가능한 변수를 만들고 싶다면 외부변수를 고려해보아야 한다.
외부 변수를 사용하는 방법은 다음과 같다.
공통으로 사용할 헤더파일을 만들고 대신 초기식을 작성하면 안된다.
//외부변수
// 초기화를 하면 안됨.
extern int e_g_i;
해당 파일에서 외부변수의 주소값을 출력하고
#include <iostream>
using namespace std;
#include "common.h"
int Add(int num1, int num2) {
// 외부 변수의 주소값을 출력해본다.
cout << "Add함수 안의 common 헤드의 외부변수 :" << &e_g_i << endl;
return num1 + num2;
}
가장 최상위에 외부변수를 초기화한다.
#include <iostream>
using namespace std;
#include "common.h"
#include "function.h"
//외부 변수 초기화
int e_g_i = 100;
int main() {
//Add함수를 실행한다.
cout << Add(2, 3) << endl;
cout << "Add함수 안의 common 헤드의 외부변수 :" << &e_g_i << endl;
return 0;
}
위와 같이 실행해보면 정적변수와 달리 외부변수의 주소값이 같은 것을 알 수 있다.
외부변수는 다른 변수들과 달리 공통으로 사용하는 헤더에는 선언만 하고 사용할 때는 초기화까지 작성하여 변수를 사용할 수 있게 된다.
main함수를 거치는 모든 cpp파일에서 사용이 가능하여 사용자의 접근을 통제하는 수단이 없다면 적절한 통제규칙을 정하여 사용하여야 예상치 못한 오류를 방지 할 수 있다.