C++ 에서 Flag를 사용하는 법 2가지
같은 C++ 솔루션 안의 다른 프로젝트들 사이에서 Flag 변수를 사용하는 방법은 대표적으로 2 가지가 있습니다.
1) Use a Global Variable
Header file 안에 전역변수로 선언하고, 사용할 솔루션에 header file에 include 시키는 방법이 있습니다.
naming conflicts와 유지보수 문제 때문에 추천되지 않는 방법입니다만 정말 간편하고 사용하기도 쉽습니다.
빠르게 일을 해결해야되는 실무에서는 정말 많이 쓰이는 방법이기 때문에 정리해봅니다.
Example) 솔루션에 Project A와 Project B가 있고, B에서 A에 있는 my pointer 라는 변수값을 사용한다고 가정
// In "ProjectA", you have the following code:
#include <iostream>
// Export the symbol so it can be accessed from other projects
extern int* myPointer;
void setPointerValue(int value)
{
int localValue = value;
myPointer = &localValue;
}
'ProjectB'에서 'ProjectA'에서 선언된 myPointer의 값에 액세스하려고 합니다.
Project B는 myPointer의 선언이 포함된 Project A의 헤더 파일을 포함해야 합니다.
#include <iostream>
#include "ProjectA.h" // Include the header file from ProjectA
int main()
{
setPointerValue(10);
std::cout << "The value of myPointer is: " << *myPointer << std::endl;
return 0;
}
클래스의 멤버변수에 access 하는 예시
1-1) Using a pointer:
- 클래스의 멤버변수를 pointer로 선언하고, extern 키워드를 사용하여 다른 프로젝트에서 symbol에 엑세스 할 수 있게 만들어 줍니다.(Scope Resolution Operator ::)
- 두 번째 프로젝트에서 선언이 포함된 헤더 파일을 포함하고 포인터를 사용하여 클래스 멤버 변수에 액세스합니다.
// ProjectA.h
#pragma once
#include <iostream>
class MyClass
{
private:
int value;
public:
// Export the symbol so it can be accessed from other projects
extern int* valuePointer;
MyClass()
{
value = 10;
valuePointer = &value;
}
};
// ProjectA.cpp
#include "ProjectA.h"
int* MyClass::valuePointer = nullptr;
// ProjectB.cpp
#include <iostream>
#include "ProjectA.h"
int main()
{
MyClass myObject;
std::cout << "The value of the class member variable is: " << *MyClass::valuePointer << std::endl;
return 0;
}
1-2) Using a reference:
- 클래스의 멤버변수를 reference로 선언하고, extern 키워드를 사용하여 다른 프로젝트에서 symbol에 엑세스 할 수 있게 만들어 줍니다.(Scope Resolution Operator ::)
- 두 번째 프로젝트에서 선언이 포함된 헤더 파일을 포함하고 reference를 사용하여 클래스 멤버 변수에 액세스합니다.
// ProjectA.h
#pragma once
#include <iostream>
class MyClass
{
private:
int value;
public:
// Export the symbol so it can be accessed from other projects
extern int& valueRef;
MyClass()
{
value = 10;
valueRef = value;
}
};
// ProjectA.cpp
#include "ProjectA.h"
int& MyClass::valueRef = MyClass().value;
// ProjectB.cpp
#include <iostream>
#include "ProjectA.h"
int main()
{
MyClass myObject;
std::cout << "The value of the class member variable is: " << MyClass::valueRef << std::endl;
return 0;
}
2) Use a Singleton Class
Singleton Class라는 Class를 새로 생성하여 사용하는 방법입니다.
전역변수에 비하면 만들기 귀찮지만 한번 만들고 나면 네이밍 문제나 유지보수 문제가 생기지 않습니다.
Singleton Class에는 private constructor(생성자)를 이용해서 Flag 변수를 class의 member variable로 선언하고
instance를 반환하는 getInstance method를 설정하여 Flag 변수의 Value를 set or retrieve합니다.
Use a Singleton Class
솔루션끼리 겹치는 header file이 있더라도 새로운 header file을 만들어 주는게 좋습니다.
Flag 변수를 사용하는 프로젝트마다 해당 header file을 include 해주면 됩니다.
Header file : flag.h
#ifndef FLAG_H
#define FLAG_H
class Flag {
private:
bool flag;
static Flag *instance;
Flag() { flag = false; }
public:
static Flag* getInstance();
void setFlag(bool value);
bool getFlag();
};
#endif
Implementation file for Singleton Class : flag.cpp
#include "flag.h"
Flag* Flag::instance = 0;
Flag* Flag::getInstance() {
if (!instance)
instance = new Flag;
return instance;
}
void Flag::setFlag(bool value) { flag = value; }
bool Flag::getFlag() { return flag; }
솔루션 파일에서 flag에 access 하여 flag variable을 사용하는 방법 :
#include "flag.h"
int main() {
Flag *flag = Flag::getInstance();
flag->setFlag(true);
bool value = flag->getFlag();
// use the value of the flag in the solution
return 0;
}
위와 같은 방법으로 각 솔루션에서 header file을 include하고 singleton class method를 사용하여 flag에 access합니다.
만약 bool이 아닌 int형으로 flag value의 data type을 지정한다면 아래와 같습니다. (main 문 생략)
class Flag {
private:
static Flag* instance;
int flag;
Flag() { flag = 0; }
Flag(const Flag&) {}
Flag& operator=(const Flag&) {}
public:
static Flag* getInstance() {
if (!instance)
instance = new Flag;
return instance;
}
void setFlag(int value) { flag = value; }
int getFlag() { return flag; }
};
#include "flag.h"
Flag* Flag::instance = 0;
Flag* Flag::getInstance() {
if (!instance)
instance = new Flag;
return instance;
}
void Flag::setFlag(int value) { flag = value; }
bool Flag::getFlag() { return flag; }
추가)
1. Class와 Instance 정리
Class는 object의 properties와 behaviors를 정의하는 Blueprint이고,
Instance는 해당 blueprint의 specific한 realization이라 볼 수 있습니다.
2. pointer와 reference 정리