Menu
Coddy logo textTech

공통 요소와 고유 요소

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 35번째.

상속을 다룰 때는 각 데이터 조각이 어디에 존재하는지 이해하는 것이 중요합니다. 일부 attributes는 공유됩니다: 부모에서 defined되고 모든 자식이 접근할 수 있습니다. 다른 것들은 고유합니다: child class 또는 인스턴스에서 특별히 생성됩니다.

다음 계층 구조를 살펴보세요:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- 공유: 클래스에 정의됨

function Animal:new(name)
    local obj = {name = name}  -- 고유: 각 인스턴스에 저장됨
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- 모든 Dogs 간에 공유됨

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- 고유: 각 Dog는 자신만의 breed를 가짐
    setmetatable(obj, Dog)
    return obj
end

Dog 인스턴스를 생성하면 일부 값은 객체에 directly 존재하고, 다른 값은 조회 체인을 통해 found됩니다:

local rex = Dog:new("Rex", "German Shepherd")

-- 이 인스턴스에 고유함 (rex에 저장됨)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- 공유됨 (lookup을 통해 찾음)
print(rex.sound)   -- "bark" (Dog에서)
print(rex.kingdom) -- "Animalia" (Animal에서)

핵심적인 차이점은 다음과 같습니다. 생성자에서 obj에 할당된 필드는 각 인스턴스에 고유하지만, class 테이블에 직접 정의된 필드는 해당 class와 그 자식의 모든 인스턴스에서 공유됩니다.

challenge icon

챌린지

쉬움

상속 계층을 통해 데이터가 어떻게 흐르는지 살펴보기 위해 CreatureDragon 클래스 시스템을 구축해 보겠습니다. 모든 인스턴스에서 공유되는 attribute와 각 개별 객체에 고유한 attribute가 무엇인지 직접 확인할 수 있습니다.

코드를 세 개의 파일에 나누어 작성합니다.

  • Creature.lua: 모든 Creature가 공유하는 클래스 수준 attribute world = "Fantasy Realm"를 포함하는 부모 클래스를 정의합니다. Creature의 이름을 인스턴스 attribute로 저장하는 :new(name) Constructor도 포함합니다.
  • Dragon.lua: Creature에서 inherits하는 자식 클래스를 정의합니다. 모든 dragon이 공유하는 클래스 수준 attribute element = "fire"를 Add합니다. :new(name, color) Constructor는 이름에 대해 부모 Constructor를 Call한 다음, 각 dragon에 대해 color를 고유한 인스턴스 attribute로 추가해야 합니다.
  • main.lua: 서로 다른 두 dragon을 Create하고 해당 attribute를 검사하여 공유 데이터와 고유 데이터의 차이를 demonstrate합니다.

두 개의 입력을 받습니다.

  1. 쉼표로 구분된 First dragon의 이름과 색상(예: Smaug,red)
  2. 쉼표로 구분된 Second dragon의 이름과 색상(예: Draco,gold)

main 파일에서 각각의 이름과 색상으로 두 dragon을 Create합니다. 그런 다음 다음 정보를 정확히 다음 순서로 출력합니다.

  1. First dragon의 name
  2. First dragon의 color
  3. Second dragon의 name
  4. Second dragon의 color
  5. First dragon의 element (Dragon 클래스에서 공유됨)
  6. Second dragon의 element (Dragon 클래스에서 공유됨)
  7. First dragon의 world (Creature 클래스에서 공유됨)

예를 들어 입력이 Smaug,redDraco,gold라면 출력은 다음과 같아야 합니다.

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

각 dragon에서 namecolor가 서로 다르지만(고유한 인스턴스 attribute), elementworld는 조회 체인을 통해 found되는 공유 클래스 attribute이므로 두 dragon에서 동일하다는 점에 주목하세요.

직접 해보기

-- main.lua: 드래곤을 생성하고 공유 속성과 고유 속성을 보여줍니다

local Dragon = require('Dragon')

-- 첫 번째 드래곤의 입력 읽기 (name,color)
local input1 = io.read()
-- 두 번째 드래곤의 입력 읽기 (name,color)
local input2 = io.read()

-- TODO: 첫 번째 입력을 파싱하여 name과 color 추출
-- Hint: string.match를 패턴 "([^,]+),([^,]+)"과 함께 사용하세요

-- TODO: 두 번째 입력을 파싱하여 name과 color 추출

-- TODO: name과 color로 첫 번째 드래곤 생성

-- TODO: name과 color로 두 번째 드래곤 생성

-- TODO: 다음을 순서대로 출력:
-- 1. 첫 번째 드래곤의 name
-- 2. 첫 번째 드래곤의 color
-- 3. 두 번째 드래곤의 name
-- 4. 두 번째 드래곤의 색상
-- 5. 첫 번째 드래곤의 element (Dragon 클래스에서 공유됨)
-- 6. 두 번째 드래곤의 element (Dragon 클래스에서 공유됨)
-- 7. 첫 번째 드래곤의 world (Creature 클래스에서 공유됨)
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러