여러 믹스인 적용하기
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 52번째.
하나의 mixin은 class에 하나의 동작 집합을 추가합니다. 하지만 실제 객체에는 여러 출처의 기능이 필요한 경우가 많습니다. 게임 객체는 주변을 이동하면서 그리고 화면에 표시되어야 할 수 있습니다. 이는 같은 mixin에 속하지 않는 서로 별개의 관심사입니다.
동일한 class에 여러 mixin을 apply하는 방법은 간단합니다. 각 mixin은 고유한 methods를 제공하며, 결과적으로 class는 이들 모두를 갖게 됩니다:
local Movable = {}
function Movable:move(dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
local Visible = {}
function Visible:show()
print("Showing at " .. self.x .. ", " .. self.y)
end
function Visible:hide()
print("Hidden")
endApply both mixin을 이전과 동일한 helper function을 사용하여 여러분의 class에 적용하세요:
local function applyMixin(class, mixin)
for key, value in pairs(mixin) do
class[key] = value
end
end
local GameObject = {}
GameObject.__index = GameObject
applyMixin(GameObject, Movable)
applyMixin(GameObject, Visible)이제 GameObject 인스턴스는 이동하고 자신을 표시할 수 있습니다:
local obj = setmetatable({x = 0, y = 0}, GameObject)
obj:move(5, 3)
obj:show() -- 5, 3에서 표시한 가지 주의할 점: 두 개의 mixin이 동일한 method 이름을 define하면, 나중에 적용된 것이 먼저 적용된 것을 덮어씁니다. 예기치 않은 동작을 피하려면 mixin methods를 서로 다르게 유지하세요.
챌린지
쉬움믹스인을 사용하여 여러 기능을 결합하는 게임용 Character 클래스를 만들어 봅시다! 캐릭터는 적을 attack하고 자신을 heal할 수 있습니다. 즉, 서로 다른 믹스인에서 제공되는 두 가지 별개의 동작을 사용할 수 있습니다.
코드를 네 개의 파일로 구성합니다:
Attacker.lua::attack(targetName)메서드를 포함하는 믹스인을Create합니다. 이 메서드는{self.name} attacks {targetName} for {self.damage} damage!를 출력합니다(객체에name및damagefields가 있다고Assumes).Healer.lua::heal(amount)메서드를 포함하는 믹스인을Create합니다. 이 메서드는 amount를self.health에 더하고{self.name} heals for {amount}. Health: {newHealth}를 출력합니다.Character.lua: 세 가지attributes를 모두 저장하는:new(name, health, damage)constructor를 가진 Character 클래스를Create합니다. 모든 캐릭터가attack과heal을 할 수 있도록 Attacker와 Healer 믹스인을Apply합니다.{name} - Health: {health}, Damage: {damage}를 출력하는:status()메서드도 포함합니다.main.lua: 여기에서applyMixinhelperfunction을 작성합니다. 캐릭터의 이름, 체력, 공격력, 공격할 대상, 회복량에 대한inputs를 읽습니다. Character를Create하고, 상태를 표시한 다음 대상을attack하고, 자신을heal한 후 상태를 다시 표시합니다.
다섯 개의 inputs를 받습니다:
- Character 이름 (문자열)
- 시작 체력 (숫자)
- Damage 값 (숫자)
attack할 대상 이름 (문자열)heal할 양 (숫자)
출력에는 두 믹스인 능력을 모두 사용하는 캐릭터가 표시되어야 합니다:
{name} - Health: {health}, Damage: {damage}
{name} attacks {target} for {damage} damage!
{name} heals for {healAmount}. Health: {newHealth}
{name} - Health: {newHealth}, Damage: {damage}예를 들어 Warrior, 100, 25, Goblin, 30을 inputs로 받았다면 출력은 다음과 같아야 합니다:
Warrior - Health: 100, Damage: 25
Warrior attacks Goblin for 25 damage!
Warrior heals for 30. Health: 130
Warrior - Health: 130, Damage: 25각 믹스인은 자체 method를 Character 클래스에 제공합니다. 캐릭터는 어느 믹스인에서도 상속되지 않습니다. 대신 applyMixin function을 통해 해당 능력을 얻습니다. 이것이 여러 믹스인을 결합하는 힘입니다!
직접 해보기
-- 메인 파일
-- TODO: applyMixin 헬퍼 함수 작성
-- 이 함수는 mixin 테이블의 모든 메서드를 target 테이블에 복사해야 합니다
local function applyMixin(target, mixin)
-- TODO: mixin 적용 구현
end
-- Character.lua에서 사용할 수 있도록 applyMixin을 전역으로 사용 가능하게 만듦
_G.applyMixin = applyMixin
local Character = require('Character')
-- 입력 읽기
local name = io.read()
local health = tonumber(io.read())
local damage = tonumber(io.read())
local targetName = io.read()
local healAmount = tonumber(io.read())
-- TODO: 주어진 name, health, damage로 Character 생성
-- TODO: 캐릭터의 상태 표시
-- TODO: 캐릭터가 target을 공격하게 하기
-- TODO: 캐릭터가 자신을 치유하게 하기
-- TODO: 캐릭터의 상태를 다시 표시
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러