단순한 믹스인
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 51번째.
컴포지션을 사용하면 객체를 다른 객체 안에 넣을 수 있습니다. 하지만 서로 관련이 없는 클래스 간에 동작을 공유하려면 어떻게 해야 할까요?
Player와 MenuItem 모두 :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와 같은 유틸리티 동작을, 그 밖에는 공통점이 전혀 없는 클래스 간에 공유하는 데 적합합니다.
챌린지
쉬움믹스인을 사용하여 태그 시스템을 만들어 봅시다! 어떤 클래스에도 적용할 수 있는 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을 만들고, 두 태그를 추가한 후 제목을 출력하고 모든 태그를 나열합니다.
입력은 세 개가 주어집니다:
- 문서 제목(문자열)
- 추가할 첫 번째 태그(문자열)
- 추가할 두 번째 태그(문자열)
출력에는 문서 제목과 그 태그가 다음과 같이 표시되어야 합니다:
Title: {title}
Tags: {tag1}, {tag2}예를 들어 입력이 Lua Basics, programming, tutorial인 경우 출력은 다음과 같습니다:
Title: Lua Basics
Tags: programming, tutorialArticle 인스턴스에 믹스인 메서드가 작동할 수 있는 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 메서드를 사용하여 모든 태그를 나열하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러