메서드 상속하기
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 32번째.
inheritance link가 설정되면 하위 class instance는 모든 상위 methods에 자동으로 access할 수 있습니다. 이는 Lua의 lookup chain을 통해 이루어집니다. instance에서 method를 호출하면 Lua는 원하는 항목을 찾을 때까지 연결된 각 table을 검색합니다.
Animal이 :breathe() method를 정의하는 다음 설정을 살펴보세요:
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog는 Animal로부터 상속받습니다
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
end이제 Dog를 create하고 부모의 method를 호출할 때 어떤 일이 일어나는지 보세요:
local buddy = Dog:new()
buddy:breathe() -- 출력: Breathing...Dog class는 :breathe()를 전혀 정의하지 않았지만 작동합니다. Lua는 먼저 buddy를 확인하고 아무것도 찾지 못한 다음 Dog를 확인하지만 여전히 아무것도 찾지 못하며, 마지막으로 Animal에서 이를 찾습니다. 이러한 자동 method inheritance 덕분에 부모에서 공유 동작을 한 번만 작성하면 모든 자식 class가 즉시 그 혜택을 받습니다.
챌린지
쉬움method inheritance가 실제로 작동하는 모습을 확인하기 위해 간단한 creature hierarchy를 만들어 봅시다! Animal Parent class와 Dog Child class를 만들고, Dog instance가 Animal에만 정의된 methods를 사용할 수 있음을 보여 줍니다.
코드를 세 개의 파일로 구성합니다:
Animal.lua: 표준 class 패턴을 사용하여 Parent class를 Define합니다. animal의 이름을 저장하는:new(name)constructor와 animal의 이름 뒤에makes a sound를 출력하는:speak()method를 포함합니다. 파일 끝에서 class를 return합니다.Dog.lua: Animal을 inherits하는 Child class를 Define합니다. Animal module을 require하고 Dog가 Animal의 methods에 access할 수 있도록 inheritance link를 설정합니다. 이름을 저장하고 Dog를 metatable로 설정하는:new(name)constructor를 포함합니다. Dog class는 자체:speak()method를 Define해서는 안 됩니다. 이 method는 Animal에서 inherited됩니다.main.lua: Dog module을 require하고, input에서 이름을 read한 다음, 해당 이름으로 Dog instance를 Create하고 그 instance에서:speak()method를 Call합니다.
하나의 input을 받습니다: 강아지의 이름입니다.
예를 들어 input이 Buddy라면 Output은 다음과 같아야 합니다:
Buddy makes a sound여기서 핵심은 Dog class가 :speak()를 전혀 Define하지 않는데도 Dog instance에서 이를 Call하면 완벽하게 작동한다는 점입니다. Lua는 Dog instance에서 Dog class로, 다시 method를 찾는 Animal class로 lookup chain을 따라갑니다. 이것이 inheritance가 작동하는 방식입니다!
직접 해보기
-- main.lua: 진입점
local Dog = require('Dog')
-- 입력에서 개의 이름을 읽기
local name = io.read()
-- TODO: 주어진 이름으로 Dog 인스턴스 생성
-- TODO: dog 인스턴스에서 :speak() 메서드 호출
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러