Menu
CoddyTech

여러 믹스인 적용하기

Coddy Lua 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 52번째.

단일 믹스인은 클래스에 하나의 동작 집합을 추가합니다. 하지만 실제 객체에는 여러 출처의 기능이 필요한 경우가 많습니다. 게임 객체는 화면에서 이동하고 동시에 표시되어야 할 수도 있습니다. 이는 같은 믹스인에 속하지 않는 별개의 두 가지 관심사입니다.

해결 방법은 간단합니다. 같은 클래스에 여러 믹스인을 적용하면 됩니다. 각 믹스인은 고유한 메서드를 제공하고, 그 결과 클래스는 모든 메서드를 갖게 됩니다.

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")
end

이전과 동일한 도우미 함수를 사용해 클래스에 두 믹스인을 모두 적용하세요:

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에 표시

주의할 점: 두 믹스인이 같은 메서드 이름을 정의하면, 나중에 적용된 믹스인이 먼저 적용된 믹스인을 덮어씁니다. 예상치 못한 동작을 방지하려면 믹스인 메서드의 이름을 서로 다르게 지정하세요.

challenge icon

챌린지

쉬움

믹스인을 사용해 여러 기능을 결합하는 게임용 Character 클래스를 만들어 봅시다! 캐릭터는 적을 공격하고 스스로를 치유할 수 있습니다. 이 두 가지 동작은 각각 별도의 믹스인에서 가져옵니다.

코드를 네 개의 파일로 나눕니다.

  • Attacker.lua: :attack(targetName) 메서드가 있는 믹스인을 만드세요. 이 메서드는 {self.name} attacks {targetName} for {self.damage} damage!를 출력합니다(객체에 name 및 damage 필드가 있다고 가정합니다).
  • Healer.lua: :heal(amount) 메서드가 있는 믹스인을 만드세요. 이 메서드는 self.health에 양을 더하고 {self.name} heals for {amount}. Health: {newHealth}를 출력합니다.
  • Character.lua: 세 가지 속성을 모두 저장하는 생성자 :new(name, health, damage)가 있는 Character 클래스를 만드세요. Attacker와 Healer 믹스인을 모두 적용해 모든 캐릭터가 공격하고 치유할 수 있게 하세요. {name} - Health: {health}, Damage: {damage}를 출력하는 :status() 메서드도 포함하세요.
  • main.lua: 여기서 applyMixin 헬퍼 함수를 작성하세요. 캐릭터의 이름, 체력, 피해량, 공격할 대상, 치유량을 입력받으세요. Character를 만들고, 상태를 표시한 다음, 대상을 공격하고, 스스로를 치유한 뒤, 상태를 다시 표시하세요.

입력은 다섯 개입니다.

  1. 캐릭터 이름(문자열)
  2. 시작 체력(숫자)
  3. 피해량(숫자)
  4. 공격할 대상 이름(문자열)
  5. 치유량(숫자)

출력에는 캐릭터가 두 믹스인의 기능을 모두 사용하는 모습이 표시되어야 합니다.

{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이면 출력은 다음과 같아야 합니다.

Warrior - Health: 100, Damage: 25
Warrior attacks Goblin for 25 damage!
Warrior heals for 30. Health: 130
Warrior - Health: 130, Damage: 25

각 믹스인은 자체 메서드를 Character 클래스에 제공합니다. 캐릭터는 어느 믹스인으로부터도 상속하지 않습니다. 대신 applyMixin 함수를 통해 해당 기능을 얻습니다. 이것이 여러 믹스인을 결합하는 강력한 방법입니다!

직접 해보기

-- 메인 파일

-- 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: 캐릭터가 대상을 공격하게 하세요

-- TODO: 캐릭터가 자신을 치유하게 하세요

-- TODO: 캐릭터의 상태를 다시 표시하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러