:new() 생성자
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 8번째.
수동으로 객체를 생성하고, empty table을 만들고, 해당 metatable을 설정한 뒤 __index를 연결하는 작업은 반복적입니다. 표준 해결책은 이 모든 작업을 대신 처리하는 :new() constructor method를 class에 직접 Define하는 것입니다.
패턴은 다음과 같습니다:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
end:new() 내부에서 어떤 일이 일어나는지 분석해 봅시다. 먼저 instance라는 empty table을 만듭니다. 그런 다음 해당 table의 metatable을 self로 설정합니다. 이는 Dog:new()을 호출할 때 Dog입니다.
Dog.__index가 Dog itself를 가리키므로, instance는 Dog에 정의된 모든 메서드를 찾을 수 있습니다. 마지막으로 새 객체를 반환합니다.
constructor 외부에 있는 Dog.__index = Dog 줄에 주목하세요. 이는 일반적인 지름길로, 별도의 metatable을 만드는 대신 class table이 prototype과 metatable 역할을 모두 합니다.
이제 객체를 깔끔하고 일관되게 생성할 수 있습니다:
local myDog = Dog:new()
myDog:bark() -- 출력: Woof!여러분이 만드는 모든 class는 이와 동일한 구조를 따릅니다. :new() constructor는 객체 생성이 이루어지는 유일한 장소가 되어 코드를 체계적이고 예측 가능하게 만듭니다.
챌린지
쉬움방금 배운 표준 constructor 패턴을 사용하여 Cat class를 만들어 봅시다. 적절한 module 구조를 연습할 수 있도록 코드를 두 파일에 나누어 구성합니다.
다음을 만듭니다:
Cat.lua: 완전한 constructor 패턴을 사용하여Catclass를 Define합니다. class에는 다음이 포함되어야 합니다:- 자기 자신을 가리키는
__index를 가진 class table - instance를 만들고, metatable을 설정한 뒤 반환하는
:new()constructor - cat의 소리를 출력하는
:meow()method
- 자기 자신을 가리키는
main.lua: Cat module을 Require하고 constructor를 사용하여 cat instance를 만듭니다. 그런 다음 모든 것이 올바르게 연결되었는지 확인하기 위해 해당 method를 호출합니다.
하나의 input, 즉 cat이 meow해야 하는 times의 number를 받게 됩니다.
여러분의 :meow() method는 정확히 다음을 출력해야 합니다:
Meow!main 파일에서 Cat:new()를 사용하여 cat을 만들고, specified된 times만큼 :meow()를 호출합니다.
예를 들어 input이 3이면 Output은 다음과 같아야 합니다:
Meow!
Meow!
Meow!직접 해보기
-- Cat 모듈 불러오기
local Cat = require('Cat')
-- 입력 읽기: 야옹할 횟수
local times = tonumber(io.read())
-- TODO: Cat:new()를 사용하여 cat 인스턴스 생성
-- TODO: 지정된 횟수만큼 :meow() 메서드 호출
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러