클래스에서의 열거형
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.STAFFweapon.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가 어디에서 왔는지 알 수 있습니다.
챌린지
쉬움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)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러