부모 메서드 호출하기
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가 행복하게 꼬리를 흔든다이 패턴은 부모 메서드가 중복하고 싶지 않은 중요한 작업을 수행할 때 유용합니다. 자식은 자신의 코드에서 부모의 로직을 먼저, 마지막에 또는 심지어 중간에 실행할 수 있으므로 동작을 결합하는 방식을 완전히 제어할 수 있습니다.
챌린지
쉬움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 메서드를 호출합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러