Menu
CoddyTech

클래스에서의 열거형

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

열거형은 클래스 안에서 변수 옆에 선언할 수 있습니다. 그러면 옵션은 해당 클래스에 속합니다:

# weapon.gd
class_name Weapon
extends RefCounted

enum Kind { SWORD, BOW, STAFF }

var kind: Kind

func _init(weapon_kind: Kind) -> void:
	kind = weapon_kind

func is_ranged() -> bool:
	return kind == Kind.BOW or kind == Kind.STAFF

weapon.gd 안에서 열거형은 Kind입니다. 다른 모든 파일에서는 값, 타입 주석, match 패턴에 클래스 이름을 먼저 씁니다. Weapon.Kind.BOW처럼 씁니다.

# blacksmith.gd
class_name Blacksmith
extends RefCounted

static func repair_cost(kind: Weapon.Kind) -> int:
	match kind:
		Weapon.Kind.SWORD:
			return 20
		Weapon.Kind.BOW:
			return 15
	return 30

옵션은 여전히 숫자입니다. Weapon.new(Weapon.Kind.BOW).kind는 1을 출력합니다. 열거형 자체는 이름에서 숫자로 매핑하는 사전처럼 작동합니다.

print(Weapon.Kind.keys())       # ["SWORD", "BOW", "STAFF"]
print(Weapon.Kind.find_key(1))  # BOW
print(Weapon.Kind["STAFF"])     # 2
print(Weapon.Kind.size())       # 3
for kind in Weapon.Kind.values():
	print(Weapon.Kind.find_key(kind), ": ", Blacksmith.repair_cost(kind))

반복문은 SWORD: 20, BOW: 15 및 STAFF: 30을 출력합니다. GDScript는 숫자가 선택지 중 하나인지 확인하지 않습니다. Weapon.new(7)은 kind가 7인 무기를 생성합니다. 이름이 지정된 선택지를 전달하면 코드가 올바르게 유지됩니다.

클래스를 설명하는 열거형은 해당 클래스 안에 속하므로, 독자는 Weapon.Kind.BOW에서 Kind가 어디에서 왔는지 알 수 있습니다.

challenge icon

챌린지

쉬움

Potion 클래스에 정의된 열거형으로 포션을 분류하세요.

  • potion.gd에서 enum Kind { HEAL, MANA, POISON }을 선언하고 kind의 타입을 Kind로 지정하세요.
  • Potion.from_text(text, strength)는 "MANA"를 Kind.MANA로 변환하고 새 포션을 반환하는 정적 함수입니다.
  • describe()는 종류 이름과 강도를 사용해 HEAL potion: +20 HP, MANA potion: +15 MP 또는 POISON potion: -5 HP를 반환합니다.
  • belt.gd에서 summary()는 열거형 순서대로 종류별 한 줄씩 반환합니다: HEAL: 2 (35 total). 각 줄에는 해당 종류의 포션 개수와 괄호 안에 강도의 합계가 포함됩니다. 포션이 없는 종류도 줄을 표시합니다.

제공된 코드는 포션이 몇 개 이어지는지 읽고(HEAL 20), 각 포션을 벨트에 추가한 다음 설명과 요약을 출력합니다. HEAL 20, POISON 5, HEAL 15에 대해 다음을 출력합니다:

Added HEAL potion: +20 HP
Added POISON potion: -5 HP
Added HEAL potion: +15 HP
HEAL: 2 (35 total)
MANA: 0 (0 total)
POISON: 1 (5 total)

코드는 potion.gd와 belt.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입력/출력 코드: 그대로 유지하세요
	var belt := Belt.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var potion := Potion.from_text(parts[0], int(parts[1]))
		belt.add(potion)
		print("Added ", potion.describe())
	for line in belt.summary():
		print(line)
quiz icon실력 점검

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

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

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