Menu
CoddyTech

부모 메서드 호출하기

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 38번째.

때로는 method를 완전히 재정의하는 것이 원하는 방식이 아닐 수 있습니다. 대신 부모의 behavior를 extend하고 싶을 수 있습니다. 즉, 부모가 하는 일을 수행한 다음 무언가를 추가하는 것입니다. 이를 위해 child의 재정의된 method 내부에서 부모 method를 직접 호출할 수 있습니다.

이 기법은 부모 클래스 이름과 함께 점 표기법을 사용하고, 첫 번째 인수로 self를 명시적으로 전달합니다:

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

-- Dog가 부모 동작을 확장합니다
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

function Dog:speak()
    Animal.speak(self)  -- 먼저 부모 메서드를 호출
    print(self.name .. " wags tail happily")
end

핵심 줄은 Animal.speak(self)입니다. 부모 클래스에서 점 표기법을 사용하고 self를 수동으로 전달하면, 자체 동작을 추가하기 전에 원래 메서드를 호출합니다:

local buddy = Dog:new("Buddy")
buddy:speak()
-- 출력:
-- Buddy가 소리를 낸다
-- Buddy가 행복하게 꼬리를 흔든다

이 패턴은 부모 메서드가 중복하고 싶지 않은 중요한 작업을 수행할 때 유용합니다. 자식은 자신의 코드에서 부모의 로직을 먼저, 마지막에 또는 심지어 중간에 실행할 수 있으므로 동작을 결합하는 방식을 완전히 제어할 수 있습니다.

challenge icon

챌린지

쉬움

FormalPerson이 일반 Person의 behavior를 확장하는 인사 시스템을 만들어 봅시다! 사람이 자신을 소개하는 방식을 완전히 대체하는 대신, formal 버전은 먼저 표준 소개를 수행한 다음 정중한 동작을 추가합니다.

코드를 세 개의 파일로 구성합니다:

  • Person.lua: 사람의 이름을 저장하는 :new(name) Constructor가 있는 Base class입니다. 사람의 이름 뒤에 says hi를 출력하는 :introduce() method를 포함하세요. 이것이 확장될 기본 behavior입니다.
  • FormalPerson.lua: Person을 상속하는 child class입니다. Constructor는 이름을 처리하기 위해 parent Constructor를 호출해야 합니다. :introduce() method를 재정의하되, parent의 behavior를 완전히 대체하는 대신 먼저 parent의 method를 호출하고, Person.introduce(self)를 사용한 다음 사람의 이름 뒤에 bows politely를 붙인 additional 줄을 출력하세요.
  • main.lua: FormalPerson 모듈을 require하고, input에서 이름을 읽고, FormalPerson instance를 Create한 다음 :introduce()를 호출하여 두 behavior가 결합된 결과를 확인하세요.

하나의 input을 받습니다: 사람의 이름입니다.

FormalPerson에서 :introduce()를 Call하면 두 줄의 Output이 생성되어야 합니다. 첫 번째는 parent의 method에서, 두 번째는 child의 Add에서 나옵니다:

{name} says hi
{name} bows politely

예를 들어 input이 Eleanor라면 Output은 다음과 같아야 합니다:

Eleanor says hi
Eleanor bows politely

여기서 핵심 insight는 FormalPerson이 "says hi" 로직을 중복하지 않는다는 것입니다. FormalPerson은 해당 작업을 parent method에 위임한 다음, 그 위에 자신만의 고유한 behavior를 Add합니다. 이를 통해 코드를 깔끔하게 유지하고 child class가 parent 기능을 대체하는 대신 확장할 수 있는 방식을 보여 줍니다!

직접 해보기

-- main.lua: 인사 시스템의 진입점

local FormalPerson = require('FormalPerson')

-- 입력에서 사람의 이름을 읽습니다
local name = io.read()

-- TODO: 주어진 이름으로 FormalPerson 인스턴스를 생성합니다

-- TODO: FormalPerson 인스턴스에서 introduce 메서드를 호출합니다
quiz icon실력 점검

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

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

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