리팩터링/리팩터링 기법

리팩터링 기법. 변수 캡슐화하기 (Encapsulate Variable)

developer-tj 2023. 3. 5. 12:00
반응형

변수 캡슐화하기(Encapsulate Variable)는 이러한 전역 데이터 문제를 해결하기 위한 방법 중 하나입니다.

전역 데이터를 사용하지 않고 클래스 내부 변수로 변경함으로써 클래스 내에서 데이터를 캡슐화하고 관리할 수 있습니다.

 

변수 캡슐화하기의 장점은 다음과 같습니다.

  1. 데이터 보호: 변수에 직접 접근하는 것을 막아, 데이터를 보호할 수 있습니다.
  2. 일관성 유지: 변수에 접근하는 메소드를 통일하여 일관성을 유지할 수 있습니다.
  3. 유지보수성 개선: 객체 내부 구현을 변경해도 클라이언트 코드가 영향을 받지 않습니다.

 

예를 들어, 다음은 전역 변수를 사용하여 이름과 나이를 저장하는 간단한 프로그램입니다.

#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 클래스는 더 많은 속성을 추가할 수 있으므로 코드의 확장성을 높일 수 있습니다.