Menu
CoddyTech

공통 요소와 고유 요소

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

상속을 다룰 때는 각 데이터가 어디에 있는지 이해하는 것이 중요합니다. 일부 속성은 공유됩니다. 부모 클래스에서 정의되어 모든 자식이 접근할 수 있습니다. 다른 속성은 고유합니다. 자식 클래스나 인스턴스에서 특별히 생성됩니다.

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

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 인스턴스를 만들면 일부 값은 객체에 직접 존재하고, 다른 값은 조회 체인을 통해 찾을 수 있습니다.

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

-- 이 인스턴스에만 고유함 (rex에 저장됨)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- 공유됨 (조회로 찾음)
print(rex.sound)   -- "bark" (Dog에서 가져옴)
print(rex.kingdom) -- "Animalia" (Animal에서 가져옴)

핵심적인 차이점은 생성자에서 obj에 할당된 필드는 각 인스턴스마다 고유하지만, 클래스 테이블에 직접 정의된 필드는 해당 클래스와 그 하위 클래스의 모든 인스턴스가 공유한다는 것입니다.

challenge icon

챌린지

쉬움

Creature와 Dragon 클래스 시스템을 만들어 상속 계층 구조를 통해 데이터가 어떻게 흐르는지 살펴봅시다. 모든 인스턴스가 공유하는 속성과 각 개별 객체에만 고유한 속성이 무엇인지 직접 확인할 수 있습니다.

코드를 세 개의 파일로 나눠 작성합니다.

  • Creature.lua: 모든 생명체가 공유하는 클래스 수준의 공통 속성 world = "Fantasy Realm"을 가진 부모 클래스를 정의합니다. 생명체의 이름을 인스턴스 속성으로 저장하는 :new(name) 생성자도 포함합니다.
  • Dragon.lua: Creature를 상속하는 자식 클래스를 정의합니다. 모든 드래곤이 공유하는 클래스 수준의 공통 속성 element = "fire"를 추가합니다. :new(name, color) 생성자에서는 이름을 위해 부모 생성자를 호출한 다음, 각 드래곤의 고유한 인스턴스 속성으로 color를 추가합니다.
  • main.lua: 서로 다른 드래곤 두 마리를 만들고, 공유 데이터와 고유 데이터의 차이를 보여 주도록 속성을 살펴봅니다.

입력은 두 개 주어집니다.

  1. 쉼표로 구분된 첫 번째 드래곤의 이름과 색상(예: Smaug,red)
  2. 쉼표로 구분된 두 번째 드래곤의 이름과 색상(예: Draco,gold)

메인 파일에서 각 드래곤의 이름과 색상을 사용해 두 드래곤을 모두 만듭니다. 그런 다음 다음 정보를 정확히 이 순서대로 출력합니다.

  1. 첫 번째 드래곤의 name
  2. 첫 번째 드래곤의 color
  3. 두 번째 드래곤의 name
  4. 두 번째 드래곤의 color
  5. 첫 번째 드래곤의 element (Dragon 클래스에서 공유)
  6. 두 번째 드래곤의 element (Dragon 클래스에서 공유)
  7. 첫 번째 드래곤의 world (Creature 클래스에서 공유)

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

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

name과 color는 드래곤마다 다르지만(고유한 인스턴스 속성), element와 world는 조회 체인을 통해 찾을 수 있는 클래스 속성이므로 두 드래곤 모두에서 동일하다는 점에 주목하세요.

직접 해보기

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

local Dragon = require('Dragon')

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

-- TODO: 첫 번째 입력을 파싱하여 이름과 색상을 추출합니다
-- 힌트: 패턴 "([^,]+),([^,]+)"과 함께 string.match를 사용합니다

-- TODO: 두 번째 입력을 파싱하여 이름과 색상을 추출합니다

-- TODO: 이름과 색상을 사용하여 첫 번째 드래곤을 생성합니다

-- TODO: 이름과 색상을 사용하여 두 번째 드래곤을 생성합니다

-- TODO: 다음 항목을 순서대로 출력합니다:
-- 1. 첫 번째 드래곤의 이름
-- 2. 첫 번째 드래곤의 색상
-- 3. 두 번째 드래곤의 이름
-- 4. 두 번째 드래곤의 색상
-- 5. 첫 번째 드래곤의 원소 (Dragon 클래스에서 공유)
-- 6. 두 번째 드래곤의 원소 (Dragon 클래스에서 공유)
-- 7. 첫 번째 드래곤의 세계 (Creature 클래스에서 공유)
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

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