정보 은닉
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;
}
};이
interface와 implementation을 이렇게 분리하면 여러 가지 이점이 있습니다. class 사용자의 복잡성을 줄이고, internal 데이터의 우발적인 오용을 방지하며, 코드를 더 쉽게 유지 관리할 수 있습니다. internal 세부 정보가 hidden 상태라면, class에 의존하는 기존 코드를 손상시키지 않고 자유롭게 최적화하거나 리팩터링할 수 있습니다.
챌린지
쉬움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::fixed와 std::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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러