자식 메서드 추가하기
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 34번째.
상속을 통해 자식 클래스는 부모 메서드에 접근할 수 있지만, 진정한 힘은 자식 클래스만이 가지는 새로운 메서드를 추가하는 데서 나옵니다. Dog는 Animal이 할 수 있는 모든 것을 할 수 있을 뿐만 아니라, 짖는 것과 같이 개에게만 고유한 기능들을 추가로 수행할 수 있습니다.
자식 전용 메서드를 추가하는 것은 간단합니다. 자식 클래스 테이블에 정의하기만 하면 됩니다. 인스턴스는 자신의 클래스에서 메서드를 먼저 조회하므로, 부모 클래스에 영향을 주지 않고 새로운 메서드를 찾을 수 있습니다.
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog은 Animal을 상속받습니다
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
-- Dog에만 있는 새로운 메서드
function Dog:bark()
print(self.name .. " says: Woof!")
end이제 Dog 인스턴스는 상속된 메서드와 고유한 메서드를 모두 사용할 수 있습니다:
local buddy = Dog:new("Buddy")
buddy:breathe() -- 출력: Buddy is breathing (상속됨)
buddy:bark() -- 출력: Buddy says: Woof! (자식 전용)부모 클래스는 변경되지 않은 상태로 유지됩니다. 일반 Animal에서 :bark()를 호출하면 해당 메서드가 존재하지 않기 때문에 실패합니다. 이것이 바로 상속을 통해 공통된 기능을 한곳에 유지하면서 동작을 특수화하는 방법입니다.
챌린지
쉬움고양이가 자신만의 특별한 능력을 갖는 반려동물 계층 구조를 만들어 봅시다! Pet 부모 클래스와 Cat 자식 클래스를 생성하게 됩니다. 여기서 Cat은 Pet의 모든 것을 상속받으면서도 고양이만 할 수 있는 고유한 메서드를 가집니다.
코드는 다음 세 개의 파일로 구성됩니다:
Pet.lua: 반려동물의 이름을 저장하는:new(name)생성자를 포함한 부모 클래스를 정의하세요. 반려동물의 이름 뒤에says hello를 출력하는:greet()메서드를 포함하세요. 표준 클래스 패턴을 설정하고 클래스를 반환합니다.Cat.lua: Pet을 상속받는 자식 클래스를 정의하세요. Cat의:new(name)생성자는 부모 생성자를 호출하여 이름을 초기화한 다음, 메타테이블을 Cat으로 다시 연결해야 합니다. 고양이의 이름 뒤에purrs contentedly를 출력하는 자식 전용:purr()메서드를 추가하세요. 이 메서드는 Cat에만 존재하며, Pet에는 없습니다!main.lua: Cat 모듈을 불러오고(require), 입력에서 이름을 읽어 Cat 인스턴스를 생성한 다음, 상속받은:greet()메서드와 고유한:purr()메서드를 모두 사용할 수 있음을 보여주세요.
하나의 입력을 받게 됩니다: 고양이의 이름.
메인 파일에서 주어진 이름으로 Cat을 생성한 다음, 별도의 줄에 :greet()와 :purr()를 차례로 호출하세요.
예를 들어, 입력이 Whiskers라면 출력은 다음과 같아야 합니다:
Whiskers says hello
Whiskers purrs contentedly첫 번째 줄은 Pet에 정의되어 상속받은 :greet() 메서드에서 출력되고, 두 번째 줄은 Cat에만 존재하는 :purr() 메서드에서 출력됩니다. 이는 자식 클래스가 부모 클래스의 모든 기능을 수행할 수 있을 뿐만 아니라 자신만의 특화된 동작을 가질 수 있음을 보여줍니다!
치트 시트
자식 클래스는 부모의 모든 메서드를 상속받으면서도 자신만이 가지는 새로운 메서드를 추가할 수 있습니다. 인스턴스는 먼저 자신의 클래스에서 메서드를 찾고, 없으면 부모 클래스로 거슬러 올라가 찾습니다.
자식 전용 메서드를 추가하려면 자식 클래스 테이블에 정의하세요:
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print(self.name .. " is breathing")
end
-- Dog inherits from Animal
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
-- Child-specific method
function Dog:bark()
print(self.name .. " says: Woof!")
end자식 인스턴스는 상속받은 메서드와 고유한 메서드를 모두 사용할 수 있습니다:
local buddy = Dog:new("Buddy")
buddy:breathe() -- Inherited from Animal
buddy:bark() -- Child-only method부모 클래스는 영향을 받지 않으며, 자식 전용 메서드에 접근할 수 없습니다.
직접 해보기
-- main.lua: Cat을 생성하고 상속을 시연합니다
local Cat = require('Cat')
-- 입력으로부터 고양이의 이름을 읽습니다
local name = io.read()
-- TODO: 주어진 이름으로 Cat 인스턴스를 생성합니다
-- TODO: 상속받은 :greet() 메서드를 호출합니다 (Pet으로부터)
-- TODO: Cat 전용 :purr() 메서드를 호출합니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.