정보 은닉
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 41번째.
정보 은닉은 캡슐화의 기본 원칙입니다. 즉, class는 필요한 것만 노출하고 internal 구현 세부 정보는 숨겨야 한다는 개념입니다. 접근 제어자와 게터/세터가 도구라면, 정보 은닉은 이러한 도구를 어떻게 사용할지 이끄는 설계 철학입니다.
목표는 클래스가 하는 일(공개 인터페이스)과 이를 수행하는 방식(내부 구현) 사이에 명확한 경계를 만드는 것입니다. 이러한 분리를 통해 클래스를 사용하는 코드에 영향을 주지 않고 내부 작동 방식을 변경할 수 있습니다.
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
출력:
25C = 77Fclass는 온도를 Celsius로 internally 저장하지만, 사용자는 이를 알 필요가 없습니다. 나중에 internal 저장 방식을 화씨 또는 켈빈으로 변경하더라도, public 메서드가 여전히 동일한 방식으로 작동하는 한 외부 코드가 중단되지 않습니다.
핵심 요점: 정보 은닉은 변경으로부터 코드를 보호합니다. 구현 세부 사항은 숨기고 안정적인 인터페이스만 공개하면 클래스를 시간이 지나도 더 쉽게 유지 관리하고 수정할 수 있습니다.
챌린지
쉬움실제 정보 은닉을 보여 주는 통화 변환기를 만들어 보겠습니다. 한 통화로 money를 내부적으로 저장하지만, 외부 코드는 데이터가 실제로 어떻게 저장되는지 전혀 알지 못한 채 여러 통화 간에 원활하게 변환할 수 있는 class를 만들게 됩니다.
코드를 두 파일로 구성합니다.
Money.php: 모든 amount를 cents 단위의 integer로 내부에 저장하는Moneyclass를 Create합니다. 이렇게 하면 부동 소수점 정밀도 문제를 피할 수 있습니다. 이 구현 세부 정보는 class 사용자가 완전히 알 수 없도록 숨겨야 합니다. class는 다음을 제공해야 합니다.- cents 단위의 amount를 store하는 private property
setDollars(float $amount): dollar amount를 받아 내부적으로 cents로 storegetDollars(): amount를 dollars로 반환(float, 소수 places 2자리)setEuros(float $amount): euros를 받아 다음 Rate를 사용하여 cents로 변환: 1 EUR = 1.10 USDgetEuros(): amount를 euros로 변환하여 반환(float, 소수 places 2자리)getInternalValue(): debugging 목적을 위해 raw cents value를 반환(integer)
main.php: Money 파일을 포함합니다. 두 개의 inputs를 받습니다. 하나는 dollar amount이고 다른 하나는 euro amount입니다.Moneyinstance를 Create합니다. 먼저 dollar amount를 float로 변환하여 설정하고, 세 줄을 print합니다. dollars value, euros equivalent, 그리고 internal cents value입니다. 그런 다음 euro amount를 float로 변환하여 설정하고, 동일한 세 values를 다시 print합니다.
이 설계의 장점은 외부 코드가 익숙한 dollar 및 euro values를 사용하면서, 모든 것이 내부적으로 cents로 store된다는 사실을 전혀 알지 못한다는 점입니다. 나중에 internal storage를 다른 기준 통화나 다른 precision 전략을 사용하도록 변경할 수도 있으며, public methods가 계속 올바르게 작동하는 한 외부 코드는 변경할 필요가 없습니다.
모든 dollar 및 euro outputs를 정확히 2개의 소수 places로 format합니다. 각 value는 자체 줄에 print되어야 하며, 결과적으로 총 six lines의 output이 됩니다.
필수 출력 형식:직접 해보기
<?php
require_once 'Money.php';
// 입력 읽기
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Money 인스턴스 생성
// TODO: 달러 금액을 설정하고 출력:
// - 달러 값 (소수점 2자리)
// - 유로 환산값 (소수점 2자리)
// - 내부 센트 값 (정수)
// TODO: 유로 금액을 설정하고 출력:
// - 달러 값 (소수점 2자리)
// - 유로 환산값 (소수점 2자리)
// - 내부 센트 값 (정수)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러