Menu
CoddyTech

템플릿 메서드 패턴

Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 53번째.

템플릿 메서드 패턴은 부모 클래스에서 알고리즘 단계의 순서를 고정하고, 각 하위 클래스가 일부 단계를 채우도록 합니다. 단계를 실행하는 부모 메서드가 템플릿 메서드입니다.

# level.gd
@abstract
class_name Level
extends RefCounted

func play() -> void:
	print("Loading ", get_level_name())
	spawn_enemies()
	print("Level complete!")

@abstract func get_level_name() -> String
@abstract func spawn_enemies() -> void

play()는 템플릿입니다. 모든 레벨은 이 순서대로 로드되고, 적을 생성하며, 완료됩니다. 서로 다른 단계는 추상적이므로 모든 하위 클래스에서 이를 작성해야 합니다.

# forest_level.gd
class_name ForestLevel
extends Level

func get_level_name() -> String:
	return "Forest"

func spawn_enemies() -> void:
	print("3 wolves appear")

CaveLevel도 같은 방식으로 작성되며, 이름은 "Cave"이고 5 bats appear입니다.

# main.gd
var levels: Array[Level] = [ForestLevel.new(), CaveLevel.new()]
for level in levels:
	level.play()
Loading Forest
3 wolves appear
Level complete!
Loading Cave
5 bats appear
Level complete!

단계에는 부모 클래스에 기본값을 지정하여 서브클래스가 재정의할 수 있도록 할 수도 있습니다. 이러한 선택적 단계를 후크라고 합니다:

# level.gd
func play() -> void:
	print("Loading ", get_level_name())
	spawn_enemies()
	if has_boss():
		print("The boss arrives")
	print("Level complete!")

func has_boss() -> bool:
	return false

has_boss()를 재정의하여 true를 반환하는 레벨만 보스 줄을 얻습니다. 하위 클래스는 단계를 작성하고 부모 클래스는 단계가 실행되는 시점을 결정하므로, 하위 클래스는 play()를 그대로 두며 모든 레벨이 같은 순서를 따릅니다.

challenge icon

챌린지

중급

게임은 동일한 단계로 두 가지 형식으로 점수를 내보냅니다. 행은 "name"과 "score"를 포함하는 딕셔너리입니다.

  • exporter.gd에서 템플릿 메서드 export_rows(rows)를 작성하세요. 이 메서드는 header()를 출력한 다음 모든 행에 대해 format_row(row)를 출력하고, 마지막으로 footer(rows)를 출력합니다. 헤더나 푸터가 빈 문자열이면 출력하지 않습니다. 후크인 header()와 footer()는 기본적으로 ""를 반환하고, format_row()는 추상 메서드입니다.
  • CsvExporter: 헤더는 name,score이고, 행은 Ada,12입니다. 푸터는 없습니다.
  • ListExporter: 헤더는 없고, 행은 * Ada scored 12이며, 푸터는 행 수를 나타내는 Players: N입니다.

제공된 코드는 형식(csv 또는 list)과 이어지는 행의 개수를 읽은 다음, 각 줄에서 NAME SCORE 형식의 행을 하나씩 읽습니다. Ada 12와 Bo 7이 입력된 list의 출력은 다음과 같습니다.

* Ada scored 12
* Bo scored 7
Players: 2

코드는 exporter.gd, csv_exporter.gd, list_exporter.gd에 작성하세요. main.gd에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 두세요
	var style := OS.read_string_from_stdin()
	var rows: Array = []
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		rows.append({"name": parts[0], "score": int(parts[1])})
	var exporter: Exporter = CsvExporter.new()
	if style == "list":
		exporter = ListExporter.new()
	exporter.export_rows(rows)
quiz icon실력 점검

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

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

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