Menu
Coddy logo textTech

이터레이터 패턴

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()을 반복해서 호출합니다. __callnil(더 이상 items가 없음)을 반환하면 loop가 중지됩니다. 이 pattern은 iteration 로직을 object 자체에 캡슐화하여, items에 접근하는 방법과 순서를 완전히 제어할 수 있게 해 줍니다.

challenge icon

챌린지

쉬움

Lua의 일반적인 for loop를 사용하여 순회할 수 있는 Playlist class를 만들어 봅시다! __call metamethod를 사용하여 Iterator pattern을 구현하고, Playlist를 노래 단위로 순회할 수 있도록 합니다.

코드를 두 개의 파일로 구성합니다:

  • Playlist.lua: 노래를 내부에 저장하는 Playlist class를 Create합니다. :new() Constructor는 빈 노래 목록을 초기화하고 iteration index를 0으로 설정해야 합니다. Playlist에 노래를 추가할 :addSong(title) method를 추가합니다. 가장 중요한 것은 __call metamethod를 Implement하여 Playlist가 "called"될 때마다 목록의 다음 노래를 반환하도록 하는 것입니다(더 이상 노래가 없으면 nil 반환).
  • main.lua: Playlist module을 Require하고 새 Playlist를 Create합니다. 받게 되는 inputs를 바탕으로 Playlist에 노래를 추가한 다음, 일반적인 for loop를 사용하여 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 California

inputs가 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
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

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