Menu
Coddy logo textTech

정보 은닉

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 36번째.

정보 은닉은 단순히 접근 지정자를 사용하는 것 이상입니다. 이는 데이터뿐만 아니라 class가 내부적으로 작동하는 방식의 implementation 세부 정보까지 숨기는 설계 원칙입니다.

목표는 class 사용자가 알아야 할 내용만 공개하고, 나머지는 모두 hidden 상태로 유지하는 것입니다. 이렇게 하면 class를 사용하는 코드에 영향을 주지 않고 internal implementation을 변경할 수 있습니다:

class Temperature {
    double kelvin;    // 내부 표현 - 숨겨진 세부 사항
    
public:
    void setCelsius(double c) {
        kelvin = c + 273.15;    // 사용자에게 숨겨진 변환
    }
    
    double getCelsius() const {
        return kelvin - 273.15;
    }
    
    double getFahrenheit() const {
        return (kelvin - 273.15) * 9.0/5.0 + 32;
    }
};

의 사용자는 온도가 내부적으로 Kelvin에 저장된다는 사실을 알지 못하며(알 필요도 없습니다). 나중에 온도를 섭씨로 저장하기로 결정하더라도 private implementation만 변경하면 되고, public interface는 변경되지 않은 상태로 유지됩니다.

interface와 implementation을 이렇게 분리하면 여러 가지 이점이 있습니다. class 사용자의 복잡성을 줄이고, internal 데이터의 우발적인 오용을 방지하며, 코드를 더 쉽게 유지 관리할 수 있습니다. internal 세부 정보가 hidden 상태라면, class에 의존하는 기존 코드를 손상시키지 않고 자유롭게 최적화하거나 리팩터링할 수 있습니다.

challenge icon

챌린지

쉬움

Distance 클래스를 만들어 정보 은닉을 보여 주세요. 거리를 내부적으로 centimeters 단위로 저장하면서도 다양한 단위로 작업할 수 있는 깔끔한 인터페이스를 제공합니다. 이 클래스를 사용하는 사람은 거리가 내부적으로 어떻게 저장되는지 알 필요도, 신경 쓸 필요도 없습니다. 그저 자신에게 편리한 단위를 사용하면 됩니다.

코드를 구성하기 위해 두 개의 파일을 만듭니다.

  • Distance.h: 내부 표현을 숨기면서 유연한 public 인터페이스를 제공하는 Distance 클래스를 정의합니다. 내부적으로 거리를 centimeters 단위의 double로 저장합니다. 이것이 숨겨진 implementation 세부 사항입니다. public 인터페이스에서는 다음 작업을 수행할 수 있어야 합니다.
    • setMeters(double m), setCentimeters(double cm) 또는 setKilometers(double km)를 사용하여 거리를 설정합니다.
    • getMeters(), getCentimeters() 또는 getKilometers()를 사용하여 거리를 가져옵니다. 모두 const 메서드여야 합니다.
    • add(const Distance& other)를 사용하여 두 거리를 더하고 새로운 Distance 객체를 반환합니다.

    거리를 0으로 초기화하는 Default 생성자를 포함합니다. 변환 로직은 메서드 내부에 숨겨져야 합니다. 사용자는 내부 저장 형식에 대해 걱정하지 않고 setKilometers(5)getMeters()를 호출하기만 하면 됩니다.

  • main.cpp: 사용자가 내부 표현을 알지 못해도 클래스를 사용할 수 있음을 보여 줍니다. 입력에서 두 개의 거리 값을 읽습니다. 첫 번째 값은 meters 단위이고 두 번째 값은 kilometers 단위입니다. 그런 다음 다음 작업을 수행합니다.
    • Distance 객체를 만들고 meters 값으로 설정합니다.
    • "In meters: <value> m"을 출력합니다.
    • "In centimeters: <value> cm"을 출력합니다.
    • "In kilometers: <value> km"을 출력합니다.
    • 두 번째 Distance 객체를 만들고 kilometers 값으로 설정합니다.
    • 두 거리를 더하고 그 결과를 저장합니다.
    • "Combined in meters: <value> m"을 출력합니다.

정보 은닉의 장점은 나중에 사용자가 클래스와 상호 작용하는 방식을 변경하지 않고 내부 저장 단위를 centimeters에서 millimeters로, 또는 다른 단위로 변경할 수 있다는 것입니다. implementation이 변경되더라도 public 인터페이스는 안정적으로 유지됩니다.

<iomanip>std::fixedstd::setprecision(2)를 사용하여 모든 출력 값을 소수점 둘째 자리까지 표시합니다. std::stod()를 사용하여 입력 문자열을 double로 변환합니다.

변환 참고: 1 meter = 100 centimeters, 1 kilometer = 1000 meters.

직접 해보기

#include <iostream>
#include <string>
#include <iomanip>
#include "Distance.h"

using namespace std;

int main() {
    // 입력 값 읽기
    string metersInput, kmInput;
    cin >> metersInput;  // 미터 단위의 첫 번째 값
    cin >> kmInput;      // Second value in kilometers
    
    // std::stod()를 사용하여 문자열을 double로 변환
    double metersValue = stod(metersInput);
    double kmValue = stod(kmInput);
    
    // 출력 형식 설정
    cout << fixed << setprecision(2);
    
    // TODO: 첫 번째 Distance 객체를 생성하고 미터 값을 사용하여 설정
    
    // TODO: "In meters: <value> m" 출력
    
    // TODO: Print "In centimeters: <value> cm"
    
    // TODO: Print "In kilometers: <value> km"
    
    // TODO: 두 번째 Distance 객체를 생성하고 킬로미터 값을 사용하여 설정
    
    // TODO: add() 메서드를 사용하여 두 거리를 더하기
    
    // TODO: Print "Combined in meters: <value> m"
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러