상속 설정
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 31번째.
지금까지는 각 객체가 하나의 프로토타입 테이블에서 메서드를 조회하는 class를 만들어 왔습니다. 하지만 하나의 class가 다른 class를 기반으로 하도록 만들고 싶다면 어떻게 해야 할까요? 바로 이때 inheritance가 사용됩니다. 자식 class는 Parent class의 everything에 액세스하면서 자체 기능을 추가할 수 있습니다.
핵심 통찰은 클래스 테이블 자체가 메타테이블을 가질 수 있다는 것입니다. Lua가 자식 클래스에서 무언가를 찾을 수 없으면 자식의 메타테이블에 있는 __index를 확인하며, 이 __index는 부모 클래스를 가리킵니다.
-- 부모 클래스
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end이제 상속 설정을 살펴보겠습니다. 자식 클래스를 만들고 해당 메타테이블이 부모를 참조하도록 설정합니다:
-- 자식 클래스
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})이 한 줄인 setmetatable(Dog, {__index = Animal})은 inheritance link를 생성합니다. Dog instance가 Dog에서 찾을 수 없는 method를 호출하면 Lua는 Animal을 확인합니다.
조회 체인은 다음과 같이 작동합니다: instance → Dog → Animal. 각 단계에서는 __index를 사용하여 다음에 검색할 테이블을 찾습니다. 이를 통해 자식 클래스는 모든 부모 메서드를 복사하지 않고도 자동으로 상속할 수 있습니다.
챌린지
쉬움첫 번째 inheritance 계층 구조를 만들어 봅시다! Machine class를 기반으로 하고 Robot class가 이를 상속하는 간단한 Parent-Child class 관계를 만들게 됩니다.
코드를 세 개의 파일로 구성합니다:
Machine.lua: 표준 class 패턴으로 Parent class를 define합니다.:new()constructor와Machine is operational을 출력하는:status()method를 포함하세요.__index를 설정하고 파일 끝에서 class를 return하는 것도 잊지 마세요.Robot.lua: Machine에서 inheritance하는 Child class를 define합니다. Machine module을 require하고, 자체__index를 사용하도록 Robot table을 설정한 다음,setmetatable(Robot, {__index = Machine})을 사용해 inheritance link를 설정하세요. Robot을 metatable로 갖는 instance를 create하는:new()constructor를 포함하세요.main.lua: Robot module을 require하고, Robot instance를 create한 뒤, inherited:status()method를 호출하여 everything을 하나로 연결합니다.
여기서 핵심 개념은 Robot class 자체에는 :status()가 define되어 있지 않다는 것입니다. Robot은 metatable chain을 통해 Machine에서 이 method를 inherited합니다. Robot instance에서 :status()를 Call하면 Lua는 먼저 Robot에서 찾고, 찾지 못하면 __index link를 따라 Machine으로 이동하여 해당 method를 발견합니다.
출력 결과는 다음과 같아야 합니다:
Machine is operational이 한 줄은 inheritance가 제대로 작동한다는 것을 증명합니다. Robot은 Parent class에만 define된 method에 성공적으로 access했습니다!
직접 해보기
-- main.lua: 모든 것을 하나로 모으기
-- TODO: Robot 모듈을 require하기
-- TODO: Robot:new()를 사용하여 Robot 인스턴스 만들기
-- TODO: robot 인스턴스에서 상속된 :status() 메서드 호출하기
-- This should print "Machine is operational"
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러