Menu
Coddy logo textTech

: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.__indexDog 자체를 가리키므로, 인스턴스는 Dog에 정의된 모든 메서드를 찾을 수 있습니다. 마지막으로, 새로운 객체를 반환합니다.

생성자 외부의 Dog.__index = Dog 줄을 주목해 보세요. 이것은 흔히 사용되는 단축 방식입니다. 별도의 메타테이블을 생성하는 대신, 클래스 테이블이 프로토타입과 메타테이블의 역할을 모두 수행하게 됩니다.

이제 객체를 생성하는 것이 깔끔하고 일관적입니다:

local myDog = Dog:new()
myDog:bark()  -- 출력: Woof!

여러분이 만드는 모든 클래스는 이와 동일한 구조를 따르게 됩니다. :new() 생성자는 객체 생성이 일어나는 유일한 장소가 되어, 코드를 체계적이고 예측 가능하게 만들어 줍니다.

challenge icon

챌린지

쉬움

방금 배운 표준 생성자 패턴을 사용하여 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() 메서드 호출하기
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨