정보 은닉
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 41번째.
정보 은닉(Information hiding)은 캡슐화의 이면에 있는 원칙으로, 클래스는 필요한 것만 노출하고 내부 구현 세부 사항은 숨겨야 한다는 개념입니다. 접근 제어자와 게터(getters)/세터(setters)가 도구라면, 정보 은닉은 이러한 도구들을 어떻게 사용할지 안내하는 설계 철학입니다.
목표는 클래스가 무엇을 하는지(공개 인터페이스)와 그것을 어떻게 수행하는지(내부 구현) 사이에 명확한 경계를 만드는 것입니다. 이러한 분리는 클래스를 사용하는 코드에 영향을 주지 않고 내부 작동 방식을 변경할 수 있음을 의미합니다:
<?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 = 77F이 클래스는 내부적으로 온도를 섭씨(Celsius)로 저장하지만, 사용자는 이를 알 필요가 없습니다. 나중에 내부 저장 방식을 화씨(Fahrenheit)나 절대온도(Kelvin)로 변경하더라도, 공개 메서드가 동일하게 작동하는 한 외부 코드는 손상되지 않습니다.
핵심 포인트: 정보 은닉은 코드의 변경으로부터 코드를 보호합니다. 구현 세부 사항을 숨기고 안정적인 인터페이스만 노출하면, 시간이 지남에 따라 클래스를 유지 관리하고 수정하기가 더 쉬워집니다.
챌린지
쉬움정보 은닉(Information Hiding)이 실제로 어떻게 작동하는지 보여주는 통화 변환기를 만들어 보겠습니다. 내부적으로는 하나의 통화로 금액을 저장하지만, 외부 코드에서는 데이터가 실제로 어떻게 저장되는지 전혀 알 필요 없이 여러 통화로 원활하게 변환하고 주고받을 수 있는 클래스를 만들 것입니다.
코드는 다음 두 개의 파일로 구성됩니다:
Money.php— 부동 소수점 정밀도 문제를 피하기 위해 모든 금액을 내부적으로 센트(정수형)로 저장하는Money클래스를 만듭니다. 이러한 구현 세부 사항은 클래스 사용자에게 완전히 숨겨져야 합니다. 클래스는 다음을 제공해야 합니다:- 센트 단위로 금액을 저장하는 private 속성
setDollars(float $amount)— 달러 금액을 받아 내부적으로 센트로 저장합니다.getDollars()— 금액을 달러로 반환합니다 (float, 소수점 2자리).setEuros(float $amount)— 유로 금액을 받아 1 EUR = 1.10 USD 환율을 사용하여 센트로 변환하여 저장합니다.getEuros()— 유로로 변환된 금액을 반환합니다 (float, 소수점 2자리).getInternalValue()— 디버깅 목적으로 원시 센트 값(정수)을 반환합니다.
main.php— Money 파일을 포함합니다. 두 개의 입력(달러 금액과 유로 금액)을 받습니다.Money인스턴스를 생성합니다. 먼저, 달러 금액(float로 변환됨)을 설정하고 세 줄을 출력합니다: 달러 값, 그에 해당하는 유로 값, 그리고 내부 센트 값. 그런 다음 유로 금액(float로 변환됨)을 설정하고 동일한 세 가지 값을 다시 출력합니다.
이 디자인의 장점은 외부 코드가 익숙한 달러와 유로 값으로 작동하며, 내부적으로 모든 것이 센트로 저장된다는 사실을 전혀 모른다는 것입니다. 나중에 내부 저장 방식을 다른 기준 통화나 다른 정밀도 전략을 사용하도록 변경하더라도, public 메서드들이 계속 올바르게 작동하는 한 외부 코드를 수정할 필요가 없습니다.
모든 달러 및 유로 출력은 정확히 소수점 2자리까지 형식을 맞추십시오. 각 값은 개별 줄에 출력되어야 하며, 총 6줄의 출력이 생성되어야 합니다.
치트 시트
정보 은닉은 캡슐화의 핵심 원칙으로, 내부 구현 세부 사항은 숨기면서 필요한 것만 노출하는 것입니다. 이는 클래스가 무엇을 하는지(공개 인터페이스)와 어떻게 하는지(내부 구현) 사이에 명확한 경계를 만듭니다.
Temperature 클래스를 사용한 정보 은닉의 예:
<?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 = 77F
이 클래스는 내부적으로 온도를 섭씨(Celsius)로 저장하지만, 사용자는 이를 알 필요가 없습니다. 공개 메서드가 동일하게 작동하는 한, 외부 코드를 손상시키지 않고 내부 저장 방식을 화씨(Fahrenheit)나 켈빈(Kelvin)으로 변경할 수 있습니다.
주요 이점: 정보 은닉은 코드의 변경으로부터 코드를 보호합니다. 구현 세부 사항을 숨기고 안정적인 인터페이스만 노출함으로써, 시간이 지남에 따라 클래스를 유지 관리하고 수정하기가 더 쉬워집니다.
직접 해보기
<?php
require_once 'Money.php';
// 입력 읽기
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Money 인스턴스 생성
// TODO: 달러 금액을 설정하고 다음을 출력:
// - 달러 값 (소수점 2자리)
// - 유로 환산 값 (소수점 2자리)
// - 내부 센트 값 (정수)
// TODO: 유로 금액을 설정하고 다음을 출력:
// - 달러 값 (소수점 2자리)
// - 유로 환산 값 (소수점 2자리)
// - 내부 센트 값 (정수)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션