Menu
Coddy logo textTech

단순한 믹스인

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 51번째.

합성(Composition)을 사용하면 객체를 다른 객체 내부에 넣을 수 있습니다. 하지만 서로 관련이 없는 클래스 간에 동작을 공유하고 싶다면 어떻게 해야 할까요?

PlayerMenuItem은 둘 다 :describe() 메서드가 필요할 수 있지만, 부모 클래스를 공유하지는 않습니다. 이럴 때 믹스인(mixins)이 등장합니다.

믹스인(mixin)은 단순히 함수들을 포함하는 테이블입니다. 이 함수들을 클래스로 복사하여 클래스에 "믹스(mix)"합니다:

local Printable = {}

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

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

이 믹스인을 클래스에 적용하려면, 믹스인 테이블의 각 함수를 클래스 테이블로 복사합니다:

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()를 가집니다

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

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

상속과 달리, 믹스인(mixins)은 부모-자식 관계를 생성하지 않습니다. 단순히 한 테이블에서 다른 테이블로 함수를 복사하는 것입니다.

이것은 믹스인(mixins)을 로깅, 직렬화 또는 설명 메서드와 같이 서로 공통점이 없는 클래스들 간에 유틸리티 동작을 공유하는 데 완벽한 도구로 만들어 줍니다.

challenge icon

챌린지

쉬움

믹스인(mixins)을 사용하여 태깅 시스템을 만들어 봅시다! 어떤 클래스에도 적용할 수 있는 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 헬퍼 함수를 작성하세요 (Article.lua에서 require를 통해 사용하게 됩니다). 그런 다음 기사 제목과 두 개의 태그에 대한 입력을 읽습니다. Article을 생성하고, 두 태그를 모두 추가한 뒤, 제목을 출력하고 모든 태그를 나열하세요.

세 개의 입력을 받게 됩니다:

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

출력은 기사의 제목과 그 뒤에 태그들이 표시되어야 합니다:

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

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

Title: Lua Basics
Tags: programming, tutorial

기억하세요: 믹스인 메서드가 작동하는 이유는 Article 인스턴스에 믹스인 메서드가 조작할 수 있는 tags 테이블이 있기 때문입니다. 믹스인은 이 테이블을 생성하지 않으며, Article 생성자가 생성합니다. 믹스인은 단지 공유된 동작을 제공할 뿐입니다!

치트 시트

믹스인(mixin)은 부모-자식 관계를 만들지 않고도 서로 관련 없는 클래스 간에 공유할 수 있는 함수들을 포함하는 테이블입니다.

믹스인을 만들려면 메서드가 포함된 테이블을 정의하세요:

local Printable = {}

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

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

클래스에 믹스인을 적용하려면 해당 함수들을 클래스 테이블로 복사합니다:

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)

믹스인을 적용한 후, 인스턴스는 믹스인 메서드를 호출할 수 있습니다:

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

믹스인은 상속 관계를 공유하지 않는 클래스들 간에 로깅, 직렬화 또는 태깅과 같은 유틸리티 동작을 공유하는 데 이상적입니다.

직접 해보기

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

-- TODO: applyMixin 함수 구현
-- 이 함수는 믹스인 테이블의 모든 메서드를 대상 테이블로 복사해야 함
function applyMixin(target, mixin)
    -- TODO: 믹스인을 반복하여 각 메서드를 대상에 복사
end

-- 입력 읽기
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()

-- TODO: 주어진 제목으로 Article 생성

-- TODO: 기사에 두 태그를 모두 추가

-- TODO: 제목을 다음 형식으로 출력: Title: {title}

-- TODO: listTags 메서드를 사용하여 모든 태그 목록 표시
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨