Lua - 모듈: 초보자 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 Lua 모듈의 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되겠습니다. 이 주제를 단계별로 탐구해 보겠습니다. 그럼 시작해 보겠습니다!

Lua - Modules

모듈이란?

거대한 레고 성을 짓고 있는 상상해 봅시다. 한 번에 모든 것을 만드는 대신, 작은 부분들을 따로 만들고 그것들을 조립하는 것이 더 쉬울지요? 프로그래밍에서 모듈이 하는 일이 exactly 그거입니다!

Lua의 모듈은 관련된 함수, 변수, 그리고 다른 코드를 포함한 미니 프로그램과 같습니다. 코드를 관리하기 쉽고 재사용 가능한 조각으로 조직하는 방법입니다. 이렇게 하면 프로그램을 이해하고 유지보수하며 디버그하기가 더 쉬워집니다.

예제 1: 간단한 모듈

greetings.lua라는 간단한 모듈을 만들어 보겠습니다:

local greetings = {}

function greetings.sayHello(name)
    return "Hello, " .. name .. "!"
end

function greetings.sayGoodbye(name)
    return "Goodbye, " .. name .. ". Have a great day!"
end

return greetings

이 예제에서 우리는 두 개의 함수 sayHellosayGoodbye를 포함한 모듈을 만들었습니다. 이 모듈을 어떻게 사용할지 곧 보여드리겠습니다!

Lua 모듈의 특성

Lua 모듈은 강력하고 유연한 몇 가지 특성을 가지고 있습니다:

  1. 기본적으로 로컬: 모듈 내의 모든 것은 명시적으로 전역으로 만들지 않는 한 로컬입니다. 이는 프로그램의 다른 부분과의 이름 충돌을 방지합니다.

  2. 반환 값: 모듈은 일반적으로 그 함수와 변수를 포함한 테이블을 반환하여 다른 프로그램 부분에서 사용할 수 있게 합니다.

  3. lahzy 로딩: 모듈은 필요할 때만 로드되므로 프로그램의 성능을 향상시킬 수 있습니다.

require 함수

이제 우리 모듈이 있으니, 어떻게 사용할까요? require 함수가 등장합니다 - 모듈의 마법의 티켓!

예제 2: require 함수 사용

greetings 모듈을 main.lua 파일에서 사용해 보겠습니다:

local myGreetings = require("greetings")

print(myGreetings.sayHello("Alice"))
print(myGreetings.sayGoodbye("Bob"))

이 코드를 실행하면 다음과 같은 출력을 보게 됩니다:

Hello, Alice!
Goodbye, Bob. Have a great day!

이 작동原理는 다음과 같습니다:

  1. require("greetings")는 우리 모듈을 로드하고 그 테이블을 반환합니다.
  2. 이 테이블을 myGreetings에 저장합니다.
  3. 이제 myGreetings.functionName()을 호출하여 모듈의 함수를 사용할 수 있습니다.

기억해야 할 사항

Lua 모듈을 사용할 때 다음 사항을 염두에 두세요:

  1. 파일 이름: 모듈의 파일 이름은 require에서 사용한 이름과 일치해야 합니다. 예를 들어, require("greetings")greetings.lua 파일을 찾습니다.

  2. 경로 탐색: Lua는 현재 디렉토리와 LUA_PATH 환경 변수에 지정된 디렉토리 등 여러 곳에서 모듈을 탐색합니다.

  3. 캐싱: 모듈이 한 번 로드되면 Lua는 그것을 캐시합니다. 동일한 모듈에 대한 후속 require 호출은 캐시된 버전을 반환합니다.

예제 3: 모듈 캐싱

우리의 greetings.lua를 캐싱을 보여주기 위해 수정해 보겠습니다:

local greetings = {}
local count = 0

function greetings.sayHello(name)
    count = count + 1
    return "Hello, " .. name .. "! (Called " .. count .. " times)"
end

return greetings

이제 이 모듈을 여러 번 사용해 보겠습니다:

local myGreetings1 = require("greetings")
local myGreetings2 = require("greetings")

print(myGreetings1.sayHello("Charlie"))
print(myGreetings2.sayHello("David"))
print(myGreetings1.sayHello("Eve"))

출력:

Hello, Charlie! (Called 1 times)
Hello, David! (Called 2 times)
Hello, Eve! (Called 3 times)

콜 수가 모든 호출에 걸쳐 증가함을 알 수 있습니다. 이는 Lua가 첫 번째 require 이후 모듈을 캐시했기 때문입니다.

예전 방식의 모듈 구현

Lua 5.1에서 소개된 모듈 시스템을 우리가 다루고 있는 동안, 예전 방식의 모듈을 만드는 방법이 있었습니다. 새로운 코드에는 추천되지 않지만, 오래된 프로그램에서는 만날 수 있습니다.

예제 4: 옛날 방식의 모듈

우리의 greetings 모듈이 옛날 방식에서 어떤 모습일지 보겠습니다:

module("greetings", package.seeall)

function sayHello(name)
    return "Hello, " .. name .. "!"
end

function sayGoodbye(name)
    return "Goodbye, " .. name .. ". Have a great day!"
end

이 모듈을 사용하려면:

require("greetings")

print(greetings.sayHello("Frank"))
print(greetings.sayGoodbye("Grace"))

이 방식은 간단해 보일 수 있지만, 전역 네임스페이스를 오염시키고 이름 충돌의 가능성을 높이는 단점이 있습니다.

결론

축하합니다! Lua 모듈의 세계로 첫 걸음을 뗐습니다. 우리는 모듈이 무엇인지, 어떻게 만들고 사용하는지, 그리고 기억해야 할 중요한 사항들을 다루었습니다. 모듈은 프로그래밍 도구箱에서 강력한 도구로, 깨끗하고 잘组织的 코드를 작성하는 데 도움이 됩니다.

기억하시오, 연습이 완성을 이루ります. 자신만의 모듈을 만들어 보고, 다른 구조를 실험해 보세요. 그리고 가장 중요한 것은, 즐겁게 코딩하세요! 미래의 Lua 마스터 여러분, 행복한 코딩을 기원합니다!

이제 우리가 다루었던 주요 함수의 요약입니다:

함수 설명
require(moduleName) 모듈을 로드하고 그 테이블을 반환합니다
module(name, package.seeall) 옛날 방식의 모듈 만들기 (새로운 코드에는 추천되지 않음)

Credits: Image by storyset