Setter 메서드
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 14번째.
Getter 메서드를 사용하면 제어된 액세스 지점을 통해 내부 데이터를 읽을 수 있습니다. Setter 메서드(mutator 메서드라고도 함)는 그 반대 역할을 합니다. Setter 메서드는 내부 상태를 수정할 수 있는 제어된 방법을 제공합니다.
car.speed = 50을 직접 할당하는 대신 car:setSpeed(50)을 호출합니다:
local Car = {}
Car.__index = Car
function Car:new()
local instance = {}
setmetatable(instance, self)
instance.speed = 0
return instance
end
function Car:setSpeed(newSpeed)
self.speed = newSpeed
end
function Car:getSpeed()
return self.speed
end처음 보면 같은 결과를 위해 일을 더 하는 것처럼 보입니다. 하지만 나중에 규칙을 추가해야 할 때 setter는 강력해집니다. speed가 음수가 되거나 최댓값을 초과하지 않도록 보장하고 싶다고 생각해 보세요.
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
end이제 모든 속도 변경은 여러분의 유효성 검사 로직을 거칩니다. :setSpeed()를 사용하는 모든 코드는 수정 없이 이러한 검사의 이점을 자동으로 누립니다. 이것이 setter의 진정한 가치입니다. setter는 데이터가 변경되는 방식을 제어할 수 있는 단일 지점을 만들어 객체를 더 안전하고 유지 관리하기 쉽게 합니다.
챌린지
쉬움setter 메서드를 사용해 온도를 스마트하게 제어하는 Thermostat class를 만들어 봅시다. 어떤 온도 값이든 허용하는 대신, thermostat은 합리적인 제한을 적용하여 온도를 쾌적한 범위 내로 유지합니다.
코드를 두 파일에 걸쳐 구성합니다:
Thermostat.lua: 표준 prototype pattern을 사용해Thermostatclass를 Define합니다. 각 thermostat은 현재temperature를 추적해야 합니다. 다음을 포함합니다:- temperature을
20으로 initializes하는:new()Constructor(쾌적한 기본값) - 현재 temperature을 returns하는
:getTemperature()Getter - temperature을 updates하지만 bounds 내로 유지하는
:setTemperature(newTemp)Setter: minimum10, maximum30
- temperature을
main.lua: Thermostat module을 Require하고 thermostat instance를 Create합니다. Setter를 사용해 다양한 temperature 변경을 시도하고 제한이 어떻게 적용되는지 확인합니다.
:setTemperature() 메서드는 다음 규칙을 적용해야 합니다:
- 새 temperature이
10보다 낮으면10으로 설정합니다 - 새 temperature이
30보다 높으면30으로 설정합니다 - Otherwise, 요청된 값으로 설정합니다
두 개의 input을 받습니다:
- 설정할 첫 번째 temperature
- 설정할 두 번째 temperature
main 파일에서 thermostat을 Create한 다음:
- initial temperature을 Print합니다
- temperature을 첫 번째 input 값으로 설정하고 result를 Print합니다
- temperature을 두 번째 input 값으로 설정하고 result를 Print합니다
각 temperature을 한 줄에 하나씩 Print합니다(숫자만).
예를 들어 input이 25와 50이면 output은 다음과 같아야 합니다:
20
25
30두 번째로 50으로 설정을 시도한 결과가 30이 되는 것을 확인하세요. Setter가 maximum limit을 자동으로 적용하기 때문입니다!
직접 해보기
-- Thermostat 모듈 불러오기
local Thermostat = require('Thermostat')
-- 입력 읽기
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Thermostat 인스턴스 생성
-- TODO: 초기 온도 출력
-- TODO: 온도를 temp1로 설정하고 결과 출력
-- TODO: 온도를 temp2로 설정하고 결과 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러