Menu
Coddy logo textTech

속성 초기화

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 9번째.

여러분이 배운 :new() 생성자는 객체를 생성하지만, 모든 인스턴스가 동일하게 시작됩니다. 실제 객체는 고유한 데이터가 필요합니다. 예를 들어 사람은 특정한 이름을 가지고, 플레이어는 시작 점수를 가집니다. 객체를 유용하게 만들려면 생성자는 인수를 받아서 이를 새 인스턴스에 할당해야 합니다.

생성자가 초기값을 받도록 확장하는 방법은 다음과 같습니다:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

이제 생성자는 namebreed를 매개변수로 받습니다. 빈 인스턴스를 생성하고 메타테이블을 설정한 후, 이 값들을 인스턴스의 필드에 직접 할당합니다. 생성된 각 객체는 고유한 namebreed를 갖게 됩니다.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- 출력: I am Rex, a German Shepherd
dog2:introduce()  -- 출력: I am Bella, a Poodle

두 마리의 개 모두 프로토타입으로부터 동일한 :introduce() 메서드를 공유하지만, 각자 자신의 인스턴스 테이블에 저장된 고유한 이름과 품종을 가집니다. 이것이 프로토타입과 매개변수화된 생성자를 결합하는 힘입니다. 즉, 개별 상태를 유지하면서 동작을 공유하는 것입니다.

challenge icon

챌린지

쉬움

각자의 이름과 나이를 가진 고유한 개인을 생성하는 Person 클래스를 만들어 보겠습니다. 적절한 모듈 구조를 연습하기 위해 코드를 두 개의 파일로 나누어 구성할 것입니다.

다음을 생성하게 됩니다:

  • Person.lua: 이름과 나이를 인자로 받는 생성자를 포함하여 Person 클래스를 정의합니다. 각 개인이 자신을 소개할 수 있도록 하는 :introduce() 메서드를 포함하세요.
  • main.lua: Person 모듈을 불러오고(require), 제공된 입력을 사용하여 person 인스턴스를 생성합니다. 그런 다음 그들이 자신을 소개하도록 하세요.

:new(name, age) 생성자는 두 값을 모두 받아 새 인스턴스에 저장해야 합니다. :introduce() 메서드는 반드시 다음 형식으로 출력해야 합니다:

Hello, my name is [name] and I am [age] years old

두 개의 입력을 받게 됩니다:

  1. 사람의 이름
  2. 사람의 나이

예를 들어, 입력값이 Alice25라면, 출력은 다음과 같아야 합니다:

Hello, my name is Alice and I am 25 years old

치트 시트

고유한 데이터를 가진 객체를 생성하려면 :new() 생성자가 매개변수를 받아 인스턴스에 할당하도록 확장하세요:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

서로 다른 값을 가진 인스턴스를 생성합니다:

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- 출력: I am Rex, a German Shepherd
dog2:introduce()  -- 출력: I am Bella, a Poodle

각 객체는 자신의 인스턴스 테이블에 저장된 고유한 데이터를 가지며, 프로토타입의 메서드를 공유합니다.

직접 해보기

-- Person 모듈을 불러옵니다
local Person = require('Person')

-- 입력을 읽습니다
local name = io.read()
local age = io.read()

-- TODO: Person:new(name, age)를 사용하여 새로운 Person 인스턴스를 생성하세요

-- TODO: 생성한 person 인스턴스에서 introduce() 메서드를 호출하세요
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨