반응형
변수 캡슐화하기(Encapsulate Variable)는 이러한 전역 데이터 문제를 해결하기 위한 방법 중 하나입니다.
전역 데이터를 사용하지 않고 클래스 내부 변수로 변경함으로써 클래스 내에서 데이터를 캡슐화하고 관리할 수 있습니다.
변수 캡슐화하기의 장점은 다음과 같습니다.
- 데이터 보호: 변수에 직접 접근하는 것을 막아, 데이터를 보호할 수 있습니다.
- 일관성 유지: 변수에 접근하는 메소드를 통일하여 일관성을 유지할 수 있습니다.
- 유지보수성 개선: 객체 내부 구현을 변경해도 클라이언트 코드가 영향을 받지 않습니다.
예를 들어, 다음은 전역 변수를 사용하여 이름과 나이를 저장하는 간단한 프로그램입니다.
#include <iostream>
#include <string>
std::string name;
int age;
int main() {
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Enter your age: ";
std::cin >> age;
std::cout << "Your name is " << name << " and you are " << age << " years old.\n";
return 0;
}
위 코드에서는 name과 age가 Global 변수로 선언되어 있습니다.
이 코드는 간단하지만 전역 변수의 사용은 코드 유지 보수성과 확장성을 저해하는 문제를 야기할 수 있습니다.
전역 변수는 다른 함수에서도 사용할 수 있으므로 코드의 예측 불가능성을 증가시킵니다.
따라서 변수 캡슐화하기를 적용하여 클래스를 생성할 수 있습니다.
다음은 클래스를 사용하여 위와 같은 프로그램을 다시 작성한 예입니다.
#include <iostream>
#include <string>
class Person {
public:
void setName(std::string n) {
name = n;
}
void setAge(int a) {
age = a;
}
std::string getName() const {
return name;
}
int getAge() const {
return age;
}
private:
std::string name;
int age;
};
int main() {
Person person;
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
person.setName(name);
int age;
std::cout << "Enter your age: ";
std::cin >> age;
person.setAge(age);
std::cout << "Your name is " << person.getName() << " and you are " << person.getAge() << " years old.\n";
return 0;
}
위 코드에서는 Person 클래스를 생성하여 name과 age를 캡슐화하였습니다.
이를 통해 다른 함수에서 Person 클래스에 대한 접근을 제한함으로써 코드 예측 가능성을 높였습니다.
또한 Person 클래스는 더 많은 속성을 추가할 수 있으므로 코드의 확장성을 높일 수 있습니다.
'리팩터링 > 리팩터링 기법' 카테고리의 다른 글
리팩터링 기법. 질의 함수와 변경 함수 분리하기(Separate Query from Modifier) (0) | 2023.03.12 |
---|---|
리팩터링 기법. 변수 쪼개기 (Split Variable) (0) | 2023.03.07 |
리팩터링 기법. 여러 함수를 클래스로 묶기 (Combine Functions into Class) (0) | 2023.03.03 |
리팩터링. 플래그 인수 제거하기 (Remove Flag Argument) (0) | 2023.03.02 |
리팩터링. Use Default Values (1) | 2023.03.01 |