:new() 생성자
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 8번째.
객체를 수동으로 생성하는 것—빈 테이블을 만들고, 메타테이블을 설정하고, __index를 연결하는 작업—은 반복적입니다. 표준적인 해결책은 이 모든 과정을 대신 처리해 주는 :new() 생성자 메서드를 클래스 내에 직접 정의하는 것입니다.
패턴은 다음과 같습니다:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
end:new() 내부에서 어떤 일이 일어나는지 살펴봅시다. 먼저, instance라고 불리는 빈 테이블을 생성합니다. 그런 다음 이것의 메타테이블을 self로 설정합니다. —이것은 Dog:new()를 호출할 때 Dog가 됩니다.
Dog.__index가 Dog 자체를 가리키므로, 인스턴스는 Dog에 정의된 모든 메서드를 찾을 수 있습니다. 마지막으로, 새로운 객체를 반환합니다.
생성자 외부의 Dog.__index = Dog 줄을 주목해 보세요. 이것은 흔히 사용되는 단축 방식입니다. 별도의 메타테이블을 생성하는 대신, 클래스 테이블이 프로토타입과 메타테이블의 역할을 모두 수행하게 됩니다.
이제 객체를 생성하는 것이 깔끔하고 일관적입니다:
local myDog = Dog:new()
myDog:bark() -- 출력: Woof!여러분이 만드는 모든 클래스는 이와 동일한 구조를 따르게 됩니다. :new() 생성자는 객체 생성이 일어나는 유일한 장소가 되어, 코드를 체계적이고 예측 가능하게 만들어 줍니다.
챌린지
쉬움방금 배운 표준 생성자 패턴을 사용하여 Cat 클래스를 만들어 보겠습니다. 적절한 모듈 구조를 연습하기 위해 코드를 두 개의 파일로 나누어 구성합니다.
다음을 생성하게 됩니다:
Cat.lua: 전체 생성자 패턴을 사용하여Cat클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:__index가 자기 자신을 가리키는 클래스 테이블- 인스턴스를 생성하고, 메타테이블을 설정하고, 이를 반환하는
:new()생성자 - 고양이 소리를 출력하는
:meow()메서드
main.lua: Cat 모듈을 불러오고(require) 생성자를 사용하여 고양이 인스턴스를 만듭니다. 그런 다음 메서드를 호출하여 모든 것이 올바르게 연결되었는지 확인합니다.
입력값으로 고양이가 야옹해야 하는 횟수를 받게 됩니다.
:meow() 메서드는 정확히 다음을 출력해야 합니다:
Meow!메인 파일에서 Cat:new()를 사용하여 고양이를 생성하고, 지정된 횟수만큼 :meow()를 호출하세요.
예를 들어, 입력이 3이라면 출력은 다음과 같아야 합니다:
Meow!
Meow!
Meow!치트 시트
Lua에서 생성자가 있는 클래스를 만들려면, 인스턴스를 생성하는 :new() 메서드를 정의하세요:
local ClassName = {}
ClassName.__index = ClassName
function ClassName:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function ClassName:method()
-- 메서드 구현
end__index 필드는 클래스 자체를 가리키며, 인스턴스가 클래스 테이블에 정의된 메서드에 접근할 수 있게 합니다.
:new() 내부에서:
- 인스턴스를 위한 빈 테이블을 생성합니다
- 메타테이블을
self(클래스)로 설정합니다 - 새 인스턴스를 반환합니다
생성자를 사용하여 객체를 생성합니다:
local obj = ClassName:new()
obj:method()직접 해보기
-- Cat 모듈 가져오기
local Cat = require('Cat')
-- 입력 읽기: 야옹할 횟수
local times = tonumber(io.read())
-- TODO: Cat:new()를 사용하여 고양이 인스턴스 생성하기
-- TODO: 지정된 횟수만큼 :meow() 메서드 호출하기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.