이터레이터 패턴
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 64번째.
객체 내부에 저장된 items의 collection이 있으면, 그 collection을 loop하고 싶은 경우가 많습니다. Lua의 generic for loop는 사용자 지정 반복자와 훌륭하게 작동하며, 이 기능을 클래스에 직접 구축할 수 있습니다.
Iterator pattern은 객체가 내부 데이터를 어떻게 순회할지 제어할 수 있게 합니다. 한 가지 우아한 접근 방식은 객체를 함수처럼 호출할 수 있게 하는 __call 메타메서드를 사용하는 것입니다. 호출할 때마다 더 이상 남은 항목이 없을 때까지 다음 항목을 반환합니다.
local Collection = {}
Collection.__index = Collection
function Collection:new()
local obj = { items = {}, index = 0 }
setmetatable(obj, Collection)
return obj
end
function Collection:add(item)
table.insert(self.items, item)
end
function Collection:__call()
self.index = self.index + 1
return self.items[self.index]
end
__call이 정의되어 있으면 while 루프를 사용하여 반복하거나 객체를 일반적인 for에 직접 전달할 수 있습니다.
local bag = Collection:new()
bag:add("apple")
bag:add("banana")
for item in bag do
print(item)
end
loop는 bag()을 반복해서 호출합니다. __call이 nil(더 이상 items가 없음)을 반환하면 loop가 중지됩니다. 이 pattern은 iteration 로직을 object 자체에 캡슐화하여, items에 접근하는 방법과 순서를 완전히 제어할 수 있게 해 줍니다.
챌린지
쉬움Lua의 일반적인 for loop를 사용하여 순회할 수 있는 Playlist class를 만들어 봅시다! __call metamethod를 사용하여 Iterator pattern을 구현하고, Playlist를 노래 단위로 순회할 수 있도록 합니다.
코드를 두 개의 파일로 구성합니다:
Playlist.lua: 노래를 내부에 저장하는 Playlistclass를 Create합니다.:new()Constructor는 빈 노래 목록을 초기화하고 iteration index를 0으로 설정해야 합니다. Playlist에 노래를 추가할:addSong(title)method를 추가합니다. 가장 중요한 것은__callmetamethod를 Implement하여 Playlist가 "called"될 때마다 목록의 다음 노래를 반환하도록 하는 것입니다(더 이상 노래가 없으면nil반환).main.lua: Playlist module을 Require하고 새 Playlist를 Create합니다. 받게 되는 inputs를 바탕으로 Playlist에 노래를 추가한 다음, 일반적인forloop를 사용하여 Playlist를 iterate하고 각 노래 제목을 한 줄에 하나씩 출력합니다.
Iterator pattern의 마법은 Playlist object가 callable이 된다는 것입니다. for loop에서 사용하면 Lua는 Playlist가 nil을 반환할 때까지 이를 반복해서 호출하므로, 각 노래를 순서대로 얻을 수 있습니다.
Playlist에 추가할 노래 제목을 각각 나타내는 세 개의 inputs를 순서대로 받게 됩니다.
예를 들어 inputs가 Bohemian Rhapsody, Stairway to Heaven, Hotel California인 경우, output은 다음과 같아야 합니다:
Bohemian Rhapsody
Stairway to Heaven
Hotel Californiainputs가 Yesterday, Imagine, Let It Be인 경우, output은 다음과 같아야 합니다:
Yesterday
Imagine
Let It Be직접 해보기
-- Playlist 모듈 불러오기
local Playlist = require('Playlist')
-- 입력에서 세 개의 노래 제목 읽기
local song1 = io.read()
local song2 = io.read()
local song3 = io.read()
-- TODO: Playlist:new()를 사용하여 새 플레이리스트 만들기
-- TODO: :addSong()을 사용하여 세 곡을 플레이리스트에 추가하기
-- TODO: 일반 for 루프를 사용하여 플레이리스트 순회하기
-- 그리고 각 노래 제목을 한 줄에 출력하기
-- Hint: for song in playlist do ... end
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러