단순한 믹스인
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 생성됨상속과 달리 믹스인은 부모-자식 관계를 만들지 않습니다. 한 테이블에서 다른 테이블로 함수를 복사할 뿐입니다.
이렇게 하면 믹스인은 로깅, 직렬화 또는 설명 메서드와 같은 유틸리티 동작을, 그 밖에는 공통점이 전혀 없는 클래스들 간에 공유하는 데 안성맞춤입니다.
챌린지
쉬움믹스인을 사용해 태그 시스템을 만들어 봅시다! 어떤 클래스에도 적용할 수 있는 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을 만들고, 두 태그를 모두 추가한 뒤, 제목을 출력하고 모든 태그를 나열합니다.
입력은 세 개입니다.
- 기사 제목(문자열)
- 추가할 첫 번째 태그(문자열)
- 추가할 두 번째 태그(문자열)
출력에는 기사 제목 다음에 태그가 표시되어야 합니다.
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 메서드를 사용하여 모든 태그 나열
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러