Menu
CoddyTech

단순한 믹스인

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

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

Player와 MenuItem 모두 :describe() 메서드가 필요할 수 있지만, 같은 부모 클래스를 공유하지는 않습니다. 이럴 때 믹스인을 사용합니다.

믹스인은 함수가 들어 있는 테이블일 뿐입니다. 함수를 복사해 클래스에 "섞어 넣습니다".

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] Player 생성됨

상속과 달리 믹스인은 부모-자식 관계를 만들지 않습니다. 한 테이블에서 다른 테이블로 함수를 복사할 뿐입니다.

이렇게 하면 믹스인은 로깅, 직렬화 또는 설명 메서드와 같은 유틸리티 동작을, 그 밖에는 공통점이 전혀 없는 클래스들 간에 공유하는 데 안성맞춤입니다.

challenge icon

챌린지

쉬움

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

코드를 다음 세 파일에 나누어 작성합니다.

  • Taggable.lua: 다음 두 메서드가 포함된 믹스인 테이블을 만듭니다.
    • :addTag(tag): self.tags에 태그를 추가합니다(테이블이 이미 있다고 가정합니다).
    • :listTags(): Tags: tag1, tag2, tag3 형식으로 모든 태그를 출력합니다(비어 있으면 Tags: none을 출력합니다).
  • Article.lua: 제목을 저장하고 비어 있는 tags 테이블을 초기화하는 생성자 :new(title)를 가진 Article 클래스를 만듭니다. 기사 제목을 반환하는 :getTitle() 메서드도 포함합니다.
  • main.lua: 여기에 applyMixin 도우미 함수를 작성한 다음 applyMixin(Article, Taggable)로 믹스인을 적용해 Article 인스턴스에 태그 지정 기능을 제공합니다. 그런 다음 기사 제목과 태그 두 개를 입력받습니다. 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

-- TODO: applyMixin을 사용하여 Taggable 믹스인을 Article에 적용

-- 입력값 읽기
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실력 점검

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

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

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