Menu
Coddy logo textTech

메서드 상속하기

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가 즉시 그 혜택을 받습니다.

challenge icon

챌린지

쉬움

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() 메서드 호출
quiz icon실력 점검

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

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

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