Setter 메서드
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 14번째.
Getter 메서드는 제어된 액세스 포인트를 통해 내부 데이터를 읽을 수 있게 해줍니다. Setter 메서드(뮤테이터(mutator) 메서드라고도 함)는 그 반대의 역할을 합니다. 즉, 내부 상태를 수정하는 제어된 방법을 제공합니다.
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)는 강력해집니다. 속도가 음수가 되지 않도록 하거나 최대치를 초과하지 않도록 보장하고 싶다고 가정해 봅시다:
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) 메서드를 사용하여 스마트하게 온도를 제어하는 Thermostat 클래스를 만들어 봅시다. 임의의 온도 값을 허용하는 대신, 여러분의 온도 조절기는 온도를 쾌적한 범위 내로 유지하도록 합리적인 제한을 적용할 것입니다.
코드는 다음 두 개의 파일로 구성됩니다:
Thermostat.lua: 표준 프로토타입 패턴을 사용하여Thermostat클래스를 정의합니다. 각 온도 조절기는 현재temperature를 추적해야 합니다. 다음을 포함하세요:- 온도를
20(쾌적한 기본값)으로 초기화하는:new()생성자 - 현재 온도를 반환하는
:getTemperature()게터(getter) - 온도를 업데이트하되, 최소
10에서 최대30사이의 범위를 유지하는:setTemperature(newTemp)설정자(setter)
- 온도를
main.lua: Thermostat 모듈을 불러오고(require) 온도 조절기 인스턴스를 생성합니다. 설정자를 사용하여 다양한 온도 변경을 시도하고 제한 사항이 어떻게 적용되는지 관찰하세요.
여러분의 :setTemperature() 메서드는 다음 규칙을 적용해야 합니다:
- 새 온도가
10미만이면,10으로 설정합니다. - 새 온도가
30초과이면,30으로 설정합니다. - 그렇지 않으면, 요청된 값으로 설정합니다.
두 개의 입력을 받게 됩니다:
- 설정할 첫 번째 온도
- 설정할 두 번째 온도
메인 파일에서 온도 조절기를 생성한 후, 다음을 수행하세요:
- 초기 온도를 출력합니다.
- 온도를 첫 번째 입력값으로 설정하고 결과를 출력합니다.
- 온도를 두 번째 입력값으로 설정하고 결과를 출력합니다.
각 온도를 별도의 줄에 출력하세요 (숫자만 출력).
예를 들어, 입력값이 25와 50이라면 출력은 다음과 같아야 합니다:
20
25
30두 번째 시도에서 50으로 설정하려고 했을 때 결과가 30이 되는 것에 주목하세요. 설정자가 자동으로 최대 제한을 적용했습니다!
치트 시트
Setter 메서드는 내부 상태를 수정하는 제어된 방법을 제공하여, 유효성 검사 규칙과 제약 조건을 추가할 수 있게 해줍니다.
기본 setter 메서드 구문:
function Car:setSpeed(newSpeed)
self.speed = newSpeed
end유효성 검사가 포함된 setter는 데이터가 변경될 때 규칙을 강제합니다:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
endGetter와 setter를 결합하면 객체 속성에 대한 제어된 접근이 가능해집니다:
local Car = {}
Car.__index = Car
function Car:new()
local instance = {}
setmetatable(instance, self)
instance.speed = 0
return instance
end
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
end
function Car:getSpeed()
return self.speed
endSetter는 데이터 수정을 위한 단일 제어 지점을 생성하여 객체를 더 안전하고 유지 관리하기 쉽게 만듭니다. Setter를 사용하는 모든 코드는 수정 없이도 유효성 검사 로직의 이점을 자동으로 누릴 수 있습니다.
직접 해보기
-- Thermostat 모듈을 불러옵니다
local Thermostat = require('Thermostat')
-- 입력을 읽습니다
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: thermostat 인스턴스를 생성합니다
-- TODO: 초기 온도를 출력합니다
-- TODO: 온도를 temp1으로 설정하고 결과를 출력합니다
-- TODO: 온도를 temp2로 설정하고 결과를 출력합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.