Menu
CoddyTech

메서드 오버라이딩 다시 살펴보기

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: 분기 체인은 새 클래스가 추가될 때마다 길어져야 합니다. 오버라이딩을 사용하면 각 클래스가 자체 동작을 가지며, 이를 호출하는 코드는 그대로 유지됩니다.

challenge icon

챌린지

쉬움

차고에서는 하나의 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)
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

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