메서드 오버라이딩 다시 살펴보기
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 21번째.
다형성은 "여러 형태"를 의미합니다. 하나의 메서드 호출이 이를 받는 객체의 클래스에 따라 서로 다른 작업을 수행합니다. 오버라이딩이 이를 가능하게 합니다.
# animal.gd
class_name Animal
extends RefCounted
func speak() -> String:
return "..."# dog.gd
class_name Dog
extends Animal
func speak() -> String:
return "Woof!"# cat.gd
class_name Cat
extends Animal
func speak() -> String:
return "Meow!"Array[Animal]은 모든 동물을 담을 수 있습니다. 루프는 각 요소가 어떤 클래스를 가지는지 알지 못한 채 speak()를 호출하고, 각 객체는 자신만의 버전으로 응답합니다:
var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
print(animal.speak())Woof!
Meow!
...Animal 매개변수를 사용하는 함수도 같은 방식으로 작동합니다. 나중에 추가하는 클래스를 포함해 모든 자식 클래스를 변경 없이 받습니다:
func make_it_speak(animal: Animal) -> void:
print("It says ", animal.speak())make_it_speak(Cat.new())It says Meow!클래스를 하나씩 확인하는 방식과 비교해 보세요. if animal is Dog: 분기 체인은 새 클래스가 추가될 때마다 길어져야 합니다. 오버라이딩을 사용하면 각 클래스가 자체 동작을 가지며, 이를 호출하는 코드는 그대로 유지됩니다.
챌린지
쉬움차고에서는 하나의 Array[Vehicle]을 통해 모든 차량을 처리합니다. vehicle.gd에서 wheels()는 0을 반환하고 sound()는 ...을 반환합니다.
Vehicle에describe()를 작성하세요. 이 함수는wheels()와sound()를 호출하여BRAND: N wheels, SOUND를 반환합니다.Car는wheels()를4로,sound()를Vroom으로 재정의합니다.Motorcycle은 각각2와Brrm으로 재정의합니다.Truck은 이미trailers의 개수를 저장합니다.wheels()는 트레일러 하나당6에4를 더한 값으로,sound()는Honk로 재정의합니다.
자식 클래스들은 describe()를 재정의하지 않습니다. 제공된 코드는 이어지는 차량의 수를 읽은 다음 차량마다 한 줄씩 읽습니다. 입력 형식은 car BRAND, motorcycle BRAND, truck BRAND TRAILERS 또는 vehicle BRAND입니다. 코드는 각 차량의 describe() 결과와 wheels()의 총합을 출력합니다. car Toyota와 truck Volvo 2를 입력하면 다음을 출력합니다.
Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18코드는 vehicle.gd, car.gd, motorcycle.gd 및 truck.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입력/출력 코드: 그대로 두세요
var count := int(OS.read_string_from_stdin())
var vehicles: Array[Vehicle] = []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "car":
vehicles.append(Car.new(p[1]))
elif p[0] == "motorcycle":
vehicles.append(Motorcycle.new(p[1]))
elif p[0] == "truck":
vehicles.append(Truck.new(p[1], int(p[2])))
else:
vehicles.append(Vehicle.new(p[1]))
var total := 0
for v in vehicles:
print(v.describe())
total += v.wheels()
print("Total wheels: %d" % total)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러