Menu
Coddy logo textTech

단순한 믹스인

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

컴포지션을 사용하면 객체를 다른 객체 안에 넣을 수 있습니다. 하지만 서로 관련이 없는 클래스 간에 동작을 공유하려면 어떻게 해야 할까요?

PlayerMenuItem 모두 :describe() 메서드가 필요할 수 있지만, 두 클래스는 부모 클래스를 공유하지 않습니다. 바로 이럴 때 믹스인이 사용됩니다.

믹스인은 함수를 포함하는 테이블일 뿐입니다. 이러한 함수를 복사해 넣어 클래스에 "혼합"합니다:

local Printable = {}

function Printable:describe()
    print("Object: " .. tostring(self))
end

function Printable:log(message)
    print("[LOG] " .. message)
end

이 mixin을 class에 apply하려면, mixin 테이블의 각 function을 class 테이블로 copy합니다:

local function applyMixin(class, mixin)
    for key, value in pairs(mixin) do
        class[key] = value
    end
end

local Player = {}
Player.__index = Player

applyMixin(Player, Printable)  -- 이제 Player는 :describe()와 :log()를 가집니다

mixin을 적용한 후에는 모든 Player 인스턴스가 해당 메서드가 클래스에 직접 정의된 것처럼 그 메서드를 호출할 수 있습니다:

local p = setmetatable({}, Player)
p:log("Player created")  -- [LOG] Player 생성됨

상속과 달리, mixins는 부모-자식 관계를 만들지 않습니다. 단순히 한 테이블에서 다른 테이블로 function을 복사하는 것입니다.

따라서 mixin은 로깅, 직렬화 또는 설명 method와 같은 유틸리티 동작을, 그 밖에는 공통점이 전혀 없는 클래스 간에 공유하는 데 적합합니다.

challenge icon

챌린지

쉬움

믹스인을 사용하여 태그 시스템을 만들어 봅시다! 어떤 클래스에도 적용할 수 있는 Taggable 믹스인을 만들고, 객체가 태그 컬렉션을 관리할 수 있도록 하여 항목, 게시물 또는 라벨이 필요한 모든 엔터티를 분류하는 데 유용하게 활용할 것입니다.

코드를 세 개의 파일로 구성합니다:

  • Taggable.lua: 두 개의 메서드를 포함하는 믹스인 테이블을 만듭니다:
    • :addTag(tag): self.tags에 태그를 추가합니다(테이블이 이미 존재한다고 가정).
    • :listTags(): Tags: tag1, tag2, tag3 형식으로 모든 태그를 출력합니다(비어 있으면 Tags: none).
  • Article.lua: 제목을 저장하고 빈 tags 테이블을 초기화하는 생성자 :new(title)를 포함한 Article 클래스를 만듭니다. Article 인스턴스에 태그 기능을 제공하도록 Taggable 믹스인을 적용합니다. 문서의 제목을 반환하는 :getTitle() 메서드도 포함합니다.
  • main.lua: 여기에서 applyMixin 헬퍼 함수를 작성합니다(이 함수는 require를 통해 Article.lua에서 사용합니다). 그런 다음 문서 제목과 두 개의 태그를 입력받습니다. Article을 만들고, 두 태그를 추가한 후 제목을 출력하고 모든 태그를 나열합니다.

입력은 세 개가 주어집니다:

  1. 문서 제목(문자열)
  2. 추가할 첫 번째 태그(문자열)
  3. 추가할 두 번째 태그(문자열)

출력에는 문서 제목과 그 태그가 다음과 같이 표시되어야 합니다:

Title: {title}
Tags: {tag1}, {tag2}

예를 들어 입력이 Lua Basics, programming, tutorial인 경우 출력은 다음과 같습니다:

Title: Lua Basics
Tags: programming, tutorial

Article 인스턴스에 믹스인 메서드가 작동할 수 있는 tags 테이블이 있기 때문에 믹스인 메서드가 작동한다는 점을 기억하세요. 믹스인은 이 테이블을 만들지 않습니다. 이 작업은 Article 생성자가 수행합니다. 믹스인은 공유 동작만 제공합니다!

직접 해보기

-- 태깅 시스템의 메인 파일
local Taggable = require('Taggable')
local Article = require('Article')

-- TODO: applyMixin 함수를 구현하세요
-- 이 함수는 mixin 테이블의 모든 메서드를 target 테이블에 복사해야 합니다
function applyMixin(target, mixin)
    -- TODO: mixin을 순회하며 각 메서드를 target에 복사하세요
end

-- 입력을 읽습니다
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()

-- TODO: 주어진 title로 Article을 생성하세요

-- TODO: 두 태그를 모두 article에 추가하세요

-- TODO: 다음 형식으로 title을 출력하세요: Title: {title}

-- TODO: listTags 메서드를 사용하여 모든 태그를 나열하세요
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

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