Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

데이터 은닉과 캡슐화를 활용한 C++ 학생 정보 관리 프로그램

학생 정보를 담는 자료형을 만들면서 데이터 은닉(Data Hiding)캡슐화(Encapsulation)를 적용한다고 가정해 봅시다. 학생 객체는 이름(first_name), 성(last_name), 나이(age), 학년(class) 항목을 가져야 하지만, 이 변수들에는 외부에서 직접 접근할 수 없도록 만들어야 합니다.

대신 get_firstname(), set_firstname(), get_age(), set_age()와 같은 접근자(getter)·설정자(setter) 함수를 정의하여 변수 값을 조회하고 갱신해야 하며, to_string() 함수를 통해 학생 정보를 (age, first_name, last_name, class) 형식으로 출력하도록 구현합니다.

프로그램은 콘솔에서 네 개의 값을 입력받아 setter 메서드로 객체에 저장한 뒤, getter 메서드로 각 항목을 출력하고, 마지막으로 to_string() 메서드로 전체 정보를 한 번에 보여주는 구조입니다.

입력 및 출력 예시

입력이 다음과 같다면,

priyam
kundu
16
10

출력 결과는 아래와 같습니다.

16
priyam
kundu
10

(16, priyam, kundu, 10)

문제 해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  • string 타입의 first_name, last_name과 int 타입의 age, cl을 멤버 변수로 갖는 클래스를 정의합니다.
  • 모든 속성에 대한 getter 함수를 정의합니다.
  • 모든 속성에 대한 setter 함수를 정의합니다.
  • stringstream 객체를 활용해 출력 형식에 맞는 포맷 문자열을 생성하는 to_string() 함수를 정의합니다.
  • main 함수에서는 다음 작업을 수행합니다.
    • 각 줄을 읽어 first_name, last_name, age, cl 순서로 저장합니다.
    • setter 함수를 호출해 값들을 클래스 멤버에 설정합니다.
    • getter 메서드로 모든 속성을 출력합니다.
    • to_string() 함수를 사용해 (age, first_name, last_name, cl) 형식으로 학생 정보를 표시합니다.

구현 예제 코드

아래 구현 예제를 통해 더 잘 이해할 수 있습니다.

#include <iostream>
#include <sstream>
using namespace std;

class Student {
    private:
    int age, cl;
    string first_name, last_name;

    public:
    // Getter 함수
    int get_age() { return age; }
    int get_class() { return cl; }
    string get_firstname() { return first_name; }
    string get_lastname() { return last_name; }

    // Setter 함수
    void set_age(int a) { age = a; }
    void set_class(int c) { cl = c; }
    void set_firstname(string fn) { first_name = fn; }
    void set_lastname(string ln) { last_name = ln; }

    // 정보를 포맷된 문자열로 반환하는 함수
    string to_string() {
        stringstream ss;
        ss << "(" << age << ", " << first_name << ", " << last_name << ", " << cl << ")";
        return ss.str();
    }
};

int main() {
    Student stud;
    int age, cl;
    string first_name, last_name;

    cin >> first_name >> last_name >> age >> cl;

    stud.set_age(age);
    stud.set_class(cl);
    stud.set_firstname(first_name);
    stud.set_lastname(last_name);

    cout << stud.get_age() << endl;
    cout << stud.get_firstname() << endl;
    cout << stud.get_lastname() << endl;
    cout << stud.get_class() << endl;

    cout << endl << stud.to_string();
}

입력

priyam
kundu
16
10

출력

16
priyam
kundu
10

(16, priyam, kundu, 10)

캡슐화의 장점

이처럼 멤버 변수를 private 영역에 두고 public 함수를 통해서만 접근하도록 설계하면 여러 가지 이점을 얻을 수 있습니다.

  • 무결성 보장: setter 함수 내부에서 값의 유효성 검사(예: 나이가 0보다 큰지 확인)를 수행할 수 있어 잘못된 데이터 유입을 막을 수 있습니다.
  • 유지보수성 향상: 내부 구현이 변경되더라도 외부 인터페이스(getter/setter)만 유지하면 되므로 코드 수정 범위를 최소화할 수 있습니다.
  • 의도치 않은 변경 방지: 객체 외부에서 멤버 변수에 직접 접근할 수 없으므로 데이터가 임의로 수정될 위험이 줄어듭니다.

이러한 특징 때문에 데이터 은닉과 캡슐화는 객체지향 프로그래밍의 핵심 원칙 중 하나로 꼽히며, 실제 프로젝트에서도 클래스 설계 시 반드시 고려해야 할 요소입니다.