Menu
Coddy logo textTech

메서드 상속하기

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 32번째.

상속 관계가 설정되면, 자식 클래스 인스턴스는 자동으로 모든 부모 메서드에 접근할 수 있게 됩니다. 이는 Lua의 조회 체인(lookup chain)을 통해 이루어집니다. 인스턴스에서 메서드를 호출하면, Lua는 원하는 항목을 찾을 때까지 연결된 각 테이블을 검색합니다.

Animal:breathe() 메서드를 정의하는 다음 설정을 고려해 보세요:

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를 생성하고 부모의 메서드를 호출할 때 어떤 일이 일어나는지 살펴보겠습니다:

local buddy = Dog:new()
buddy:breathe()  -- 출력: 숨 쉬는 중...

Dog 클래스는 :breathe()를 정의한 적이 없지만, 잘 작동합니다. Lua는 먼저 buddy를 확인하고, 아무것도 찾지 못하면 Dog를 확인하고, 여전히 아무것도 없으면 마지막으로 Animal에서 그것을 찾습니다. 이러한 자동 메서드 상속은 공유된 동작을 부모 클래스에 한 번만 작성하면 모든 자식 클래스가 즉시 혜택을 받는다는 것을 의미합니다.

challenge icon

챌린지

쉬움

메서드 상속이 실제로 어떻게 작동하는지 확인하기 위해 간단한 생물 계층 구조를 만들어 봅시다! Animal 부모 클래스와 Dog 자식 클래스를 생성한 다음, Dog 인스턴스가 Animal에만 정의된 메서드를 사용할 수 있음을 증명해 보세요.

코드는 세 개의 파일로 구성됩니다:

  • Animal.lua: 표준 클래스 패턴을 사용하여 부모 클래스를 정의합니다. 동물의 이름을 저장하는 :new(name) 생성자와, 동물의 이름 뒤에 makes a sound를 붙여 출력하는 :speak() 메서드를 포함하세요. 파일 끝에서 클래스를 반환합니다.
  • Dog.lua: Animal을 상속받는 자식 클래스를 정의합니다. Animal 모듈을 require하고 Dog가 Animal의 메서드에 접근할 수 있도록 상속 링크를 설정하세요. 이름을 저장하고 Dog를 메타테이블로 설정하는 :new(name) 생성자를 포함하세요. Dog 클래스는 자체 :speak() 메서드를 정의해서는 안 됩니다. 이 메서드는 Animal로부터 상속받게 됩니다.
  • main.lua: Dog 모듈을 require하고, 입력에서 이름을 읽어 해당 이름으로 Dog 인스턴스를 생성한 뒤, :speak() 메서드를 호출하세요.

입력으로 강아지의 이름 하나를 받게 됩니다.

예를 들어, 입력이 Buddy라면 출력은 다음과 같아야 합니다:

Buddy makes a sound

여기서 마법 같은 점은 Dog 클래스가 :speak()를 정의하지 않았음에도 Dog 인스턴스에서 이를 호출하면 완벽하게 작동한다는 것입니다. Lua는 Dog 인스턴스에서 Dog 클래스로, 그다지 다시 Animal 클래스로 이어지는 조회 체인을 따라가며 메서드를 찾습니다. 이것이 바로 상속의 원리입니다!

치트 시트

자식 클래스 인스턴스는 Lua의 조회 체인(lookup chain)을 통해 모든 부모 메서드에 자동으로 접근할 수 있습니다. 인스턴스에서 메서드가 호출되면, Lua는 메서드를 찾을 때까지 연결된 각 테이블을 검색합니다.

상속 설정하기

부모 클래스 정의:

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})

function Dog:new()
    local obj = {}
    setmetatable(obj, Dog)
    return obj
end

상속된 메서드 사용하기

자식 인스턴스는 자식 클래스에 정의되어 있지 않더라도 부모 메서드를 호출할 수 있습니다:

local buddy = Dog:new()
buddy:breathe()  -- Output: Breathing...

조회 체인: Lua는 메서드를 찾을 때까지 buddyDogAnimal 순으로 확인합니다.

다중 파일 클래스 구성

부모 클래스 파일 (Animal.lua):

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:speak()
    print(self.name .. " makes a sound")
end

return Animal

자식 클래스 파일 (Dog.lua):

local Animal = require("Animal")

local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = {name = name}
    setmetatable(obj, Dog)
    return obj
end

return Dog

메인 파일 사용법:

local Dog = require("Dog")
local buddy = Dog:new("Buddy")
buddy:speak()  -- Output: Buddy makes a sound

직접 해보기

-- main.lua: 진입점

local Dog = require('Dog')

-- 입력으로부터 개의 이름을 읽음
local name = io.read()

-- TODO: 주어진 이름으로 Dog 인스턴스 생성

-- TODO: dog 인스턴스에서 :speak() 메서드 호출
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨