Menu
Coddy logo textTech

상속 설정

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

지금까지 여러분은 각 객체가 단일 프로토타입 테이블에서 메서드를 조회하는 클래스를 구축해 왔습니다. 하지만 한 클래스가 다른 클래스를 기반으로 확장되기를 원한다면 어떻게 해야 할까요? 여기서 상속(inheritance)이 등장합니다. 자식 클래스는 부모 클래스의 모든 것에 접근할 수 있으면서 자신만의 기능을 추가할 수 있습니다.

핵심적인 통찰은 클래스 테이블 자체가 메타테이블을 가질 수 있다는 점입니다. Lua가 자식 클래스에서 무언가를 찾을 수 없을 때, 자식의 메타테이블의 __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})—가 상속 연결을 생성합니다. Dog 인스턴스가 Dog에서 찾을 수 없는 메서드를 호출하면, Lua는 Animal을 확인합니다.

조회 체인은 다음과 같이 작동합니다: instance → Dog → Animal. 각 단계는 __index를 사용하여 검색할 다음 테이블을 찾습니다. 이를 통해 자식 클래스는 부모 메서드를 복사하지 않고도 자동으로 모든 부모 메서드를 상속받을 수 있습니다.

challenge icon

챌린지

쉬움

첫 번째 상속 계층 구조를 만들어 봅시다! Machine 클래스가 기본 클래스 역할을 하고, Robot 클래스가 이를 상속받는 간단한 부모-자식 클래스 관계를 만들 것입니다.

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

  • Machine.lua: 표준 클래스 패턴을 사용하여 부모 클래스를 정의합니다. :new() 생성자와 Machine is operational을 출력하는 :status() 메서드를 포함하세요. __index를 설정하고 파일 끝에서 클래스를 반환하는 것을 잊지 마세요.
  • Robot.lua: Machine을 상속받는 자식 클래스를 정의합니다. Machine 모듈을 require하고, 자체 __index를 가진 Robot 테이블을 설정한 다음, setmetatable(Robot, {__index = Machine})를 사용하여 상속 링크를 구축하세요. Robot을 메타테이블로 사용하는 인스턴스를 생성하는 :new() 생성자를 포함하세요.
  • main.lua: Robot 모듈을 require하고, Robot 인스턴스를 생성한 뒤, 상속받은 :status() 메서드를 호출하여 모든 것을 하나로 묶습니다.

여기서 핵심 개념은 Robot 클래스가 :status()를 직접 정의하지 않는다는 것입니다. 대신 메타테이블 체인을 통해 Machine으로부터 이 메서드를 상속받습니다. Robot 인스턴스에서 :status()를 호출하면, Lua는 먼저 Robot에서 찾고, 찾지 못하면 __index 링크를 따라 Machine으로 가서 해당 메서드를 찾아냅니다.

출력 결과는 다음과 같아야 합니다:

Machine is operational

이 한 줄의 결과는 상속이 제대로 작동하고 있음을 증명합니다. Robot이 부모 클래스에만 정의된 메서드에 성공적으로 접근한 것입니다!

치트 시트

Lua에서 상속을 구현하려면, __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})을 통해 생성됩니다. 이를 통해 Dog 인스턴스는 Animal 메서드에 자동으로 접근할 수 있습니다.

조회 체인은 다음과 같습니다: 인스턴스 → 자식 클래스 → 부모 클래스. 각 단계에서는 __index를 사용하여 검색할 다음 테이블을 찾습니다.

직접 해보기

-- main.lua: 모든 것을 하나로 합치기

-- TODO: Robot 모듈 불러오기

-- TODO: Robot:new()를 사용하여 Robot 인스턴스 생성하기

-- TODO: 생성한 로봇 인스턴스에서 상속된 :status() 메서드 호출하기
-- "Machine is operational"이 출력되어야 합니다
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨