공통 요소와 고유 요소
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
endlocal 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
endDog 인스턴스를 생성하면 일부 값은 객체에 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와 그 자식의 모든 인스턴스에서 공유됩니다.
챌린지
쉬움상속 계층을 통해 데이터가 어떻게 흐르는지 살펴보기 위해 Creature 및 Dragon 클래스 시스템을 구축해 보겠습니다. 모든 인스턴스에서 공유되는 attribute와 각 개별 객체에 고유한 attribute가 무엇인지 직접 확인할 수 있습니다.
코드를 세 개의 파일에 나누어 작성합니다.
Creature.lua: 모든 Creature가 공유하는 클래스 수준 attributeworld = "Fantasy Realm"를 포함하는 부모 클래스를 정의합니다. Creature의 이름을 인스턴스 attribute로 저장하는:new(name)Constructor도 포함합니다.Dragon.lua: Creature에서 inherits하는 자식 클래스를 정의합니다. 모든 dragon이 공유하는 클래스 수준 attributeelement = "fire"를 Add합니다.:new(name, color)Constructor는 이름에 대해 부모 Constructor를 Call한 다음, 각 dragon에 대해color를 고유한 인스턴스 attribute로 추가해야 합니다.main.lua: 서로 다른 두 dragon을 Create하고 해당 attribute를 검사하여 공유 데이터와 고유 데이터의 차이를 demonstrate합니다.
두 개의 입력을 받습니다.
- 쉼표로 구분된 First dragon의 이름과 색상(예:
Smaug,red) - 쉼표로 구분된 Second dragon의 이름과 색상(예:
Draco,gold)
main 파일에서 각각의 이름과 색상으로 두 dragon을 Create합니다. 그런 다음 다음 정보를 정확히 다음 순서로 출력합니다.
- First dragon의
name - First dragon의
color - Second dragon의
name - Second dragon의
color - First dragon의
element(Dragon 클래스에서 공유됨) - Second dragon의
element(Dragon 클래스에서 공유됨) - First dragon의
world(Creature 클래스에서 공유됨)
예를 들어 입력이 Smaug,red와 Draco,gold라면 출력은 다음과 같아야 합니다.
Smaug
red
Draco
gold
fire
fire
Fantasy Realm각 dragon에서 name과 color가 서로 다르지만(고유한 인스턴스 attribute), element와 world는 조회 체인을 통해 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 클래스에서 공유됨)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러