Menu
Coddy logo textTech

자식 메서드 추가하기

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

상속을 사용하면 자식 클래스가 부모 메서드에 접근할 수 있지만, 진정한 강력함은 자식만 가진 새 메서드를 추가하는 데서 나옵니다. DogAnimal이 할 수 있는 모든 일을 할 수 있으며, 짖기처럼 개에게만 고유한 일도 할 수 있습니다.

child 전용 method를 추가하는 것은 간단합니다. child class table에 정의하기만 하면 됩니다. instance는 먼저 자신의 class에서 methods를 찾으므로, parent에 영향을 주지 않고 새 method를 찾게 됩니다.

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가 숨을 쉬고 있습니다 (상속됨)
buddy:bark()     -- 출력: Buddy가 말합니다: Woof! (자식 전용)

parent 클래스는 변경되지 않은 채로 유지됩니다. 일반적인 Animal에 :bark()를 호출하면 해당 method가 그곳에 존재하지 않으므로 실패합니다. 이것이 inheritance를 통해 공유 기능은 한곳에 유지하면서 동작을 특화할 수 있는 방식입니다.

challenge icon

챌린지

쉬움

고양이가 자신만의 특별한 능력을 가진 반려동물 계층 구조를 만들어 봅시다! Pet 부모 클래스를 만들고, Cat 자식 클래스를 만들어 CatPet의 모든 것을 상속하면서도 고양이만 할 수 있는 고유한 메서드를 갖도록 합니다.

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

  • Pet.lua: 반려동물의 이름을 저장하는 :new(name) 생성자가 있는 부모 클래스를 정의합니다. 반려동물의 이름 뒤에 says hello를 출력하는 :greet() 메서드를 포함합니다. 표준 클래스 패턴을 설정하고 클래스를 반환합니다.
  • Cat.lua: Pet에서 상속하는 자식 클래스를 정의합니다. Cat:new(name) 생성자는 부모 생성자를 호출하여 이름을 초기화한 다음 메타테이블을 Cat에 다시 연결해야 합니다. 고양이의 이름 뒤에 purrs contentedly를 출력하는 자식 전용 :purr() 메서드를 추가합니다. 이 메서드는 Cat에만 존재합니다. Pet에는 없습니다!
  • main.lua: Cat 모듈을 불러오고, 입력에서 이름을 읽고, Cat 인스턴스를 만들고, 상속된 :greet() 메서드와 자신만의 고유한 :purr() 메서드를 모두 사용할 수 있음을 보여 줍니다.

입력으로 하나의 값, 즉 고양이의 이름을 받습니다.

main 파일에서 주어진 이름으로 Cat을 만들고, 별도의 줄에서 :greet()를 호출한 다음 :purr()를 호출합니다.

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

Whiskers says hello
Whiskers purrs contentedly

첫 번째 줄은 Pet에 정의된 상속된 :greet() 메서드에서 나오고, 두 번째 줄은 Cat에만 존재하는 :purr() 메서드에서 나옵니다. 이는 자식 클래스가 부모 클래스가 할 수 있는 모든 일을 할 수 있을 뿐만 아니라, 자신만의 특화된 동작도 추가할 수 있음을 보여 줍니다!

직접 해보기

-- main.lua: Cat을 생성하고 상속을 시연합니다

local Cat = require('Cat')

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

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

-- TODO: 상속된 :greet() 메서드를 호출합니다 (Pet에서)

-- TODO: Cat 전용 :purr() 메서드를 호출합니다
quiz icon실력 점검

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

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

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