Menu
Coddy logo textTech

메서드 오버라이딩

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

지금까지 child classes는 부모 method를 상속하고 새로운 method를 추가했습니다. 하지만 child에게 동일한 method 이름다른 동작이 필요하다면 어떨까요? 이를 method 오버라이딩이라고 합니다.

parent에 있는 것과 같은 이름의 method를 child class에 정의하면 child의 버전이 우선합니다. Lua의 조회 체인은 먼저 child class를 확인하고, 그곳에서 method를 찾으면 검색을 중단합니다.

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가 speak()를 오버라이드합니다
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()
    print(self.name .. " barks: Woof!")
end

이제 각 class는 동일한 method 호출에 다르게 응답합니다:

local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")

generic:speak()  -- 출력: Creature가 소리를 냅니다
buddy:speak()    -- 출력: Buddy가 짖습니다: Woof!

Dog의 :speak()는 Dog 인스턴스에 대해 부모 버전을 완전히 대체합니다. 이를 통해 일관된 인터페이스를 유지하면서 특화된 동작을 만들 수 있습니다. 모든 animal은 :speak()할 수 있지만, 각 종은 이를 다르게 수행합니다.

challenge icon

챌린지

쉬움

서로 다른 동물들이 각자 고유한 방식으로 말하는 작은 동물 왕국을 만들어 봅시다! Animal 부모 클래스를 만들고, 부모 클래스의 :speak() 메서드를 각각 고유한 동작으로 재정의하는 두 개의 자식 클래스 CatCow를 만드세요.

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

  • Animal.lua: 동물의 이름을 저장하는 :new(name) 생성자를 포함하는 기본 클래스입니다. 동물의 이름 뒤에 makes a sound를 출력하는 :speak() 메서드도 포함하세요. 이것은 자식 클래스가 재정의할 기본 동작입니다.
  • Cat.lua: Animal을 상속하는 자식 클래스입니다. :new(name) 생성자는 부모 생성자를 호출한 다음 메타테이블을 Cat에 다시 연결해야 합니다. :speak() 메서드를 재정의하여 cats가 다른 소리를 내도록 하세요. cat의 이름 뒤에 meows: Meow!를 출력합니다.
  • Cow.lua: Animal을 상속하는 또 다른 자식 클래스입니다. Cat과 같은 방식으로 생성자를 설정하세요. :speak()를 재정의하여 cows가 이름 뒤에 moos: Moo!를 출력하도록 하세요.
  • main.lua: 모든 것을 함께 연결합니다! input에서 두 개의 이름을 읽고, first 이름으로 Cat을, second 이름으로 Cow를 만든 다음, 각 객체에서 :speak()를 호출하여 동일한 메서드 이름이 클래스에 따라 서로 다른 출력을 생성하는 것을 보여 주세요.

두 개의 입력을 받습니다:

  1. cat의 이름
  2. cow의 이름

main 파일에서 두 동물을 모두 만들고, 먼저 cat에서 :speak()를 호출한 다음 cow에서 호출하세요.

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

Whiskers meows: Meow!
Bessie moos: Moo!

두 동물이 동일한 :speak() 메서드 호출에 응답하지만, 각각 자신의 유형에 맞는 출력을 생성한다는 점에 주목하세요. Cat의 버전은 부모의 일반적인 "makes a sound" 동작을 완전히 대체하며, Cow의 버전도 마찬가지입니다. 이것이 바로 메서드 재정의가 실제로 동작하는 모습입니다. 동일한 인터페이스, 서로 다른 구현!

직접 해보기

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

local Cat = require('Cat')
local Cow = require('Cow')

-- 입력 읽기
local catName = io.read()
local cowName = io.read()

-- TODO: 첫 번째 이름으로 Cat 생성하기

-- TODO: 두 번째 이름으로 Cow 생성하기

-- TODO: 먼저 cat에서 :speak()를 호출한 다음 cow에서 호출하기
quiz icon실력 점검

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

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

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