가상 메서드 소개
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 31번째.
Python에는 __init__ 및 __str__과 같은 매직 메서드가 있으며, 언어가 이를 대신 호출합니다. Godot에서 이에 해당하는 것은 가상 메서드입니다. 이름이 정해져 있고 밑줄로 시작하는 메서드로, 클래스에서 정의하면 Godot가 적절한 시점에 호출합니다. 이미 두 가지를 사용해 보았습니다:
_init()은new()가 객체를 생성할 때 실행되며,new()에 전달된 인수를 받습니다._ready()는 노드가 씬 트리에 들어갈 때 실행되며, 이때main.gd가 시작됩니다.
그 밖에는 객체를 출력할 때 호출되는 _to_string(), 객체를 순회하는 for 루프를 가능하게 하는 반복자 메서드(둘 다 다음 강의에서 다룹니다), 그리고 엔진으로부터 이벤트를 받는 _notification()이 있습니다. 그중 하나인 NOTIFICATION_PREDELETE는 객체가 삭제되기 직전에 도착합니다:
# torch.gd
class_name Torch
extends RefCounted
var label: String
func _init(new_label: String = "Torch") -> void:
label = new_label
print(label, " lit")
func _notification(what: int) -> void:
if what == NOTIFICATION_PREDELETE:
print(label, " burned out")# main.gd
var torch := Torch.new("Hall torch") # 복도 횃불이 켜짐
torch = null # 복도 횃불이 다 타서 꺼짐RefCounted 객체는 더 이상 어떤 변수도 참조하지 않게 되는 즉시 삭제되므로, torch = null은 알림을 즉시 보냅니다. _init()의 기본값은 new()의 인수를 선택 사항으로 만듭니다. Torch.new()는 Torch라는 torch를 생성합니다.
Python도 연산자에 매직 메서드를 사용합니다. 예를 들어 +에는 __add__를, ==에는 __eq__를 사용합니다. GDScript에는 연산자 오버로딩이 없습니다: potion_a + potion_b는 오류입니다. 대신 메서드를 작성하세요.
# potion.gd
class_name Potion
extends RefCounted
var power: int
func _init(start_power: int) -> void:
power = start_power
func combined(other: Potion) -> Potion:
return Potion.new(power + other.power)potion_a.combined(potion_b)는 새로운 물약을 반환하고 두 원래 물약은 변경하지 않습니다. 두 객체 사이의 ==는 양쪽이 동일한 객체인지 확인하며, 값이 일치하는지는 확인하지 않습니다. 즉, Potion.new(5) == Potion.new(5)는 false입니다. 값을 비교해야 할 때는 equals(other)와 같은 메서드를 작성하세요.
챌린지
쉬움counter.gd에 Counter 클래스를 작성하세요.
_init(start = 0, step_size = 1)는 시작값을value에, 단계 크기를step에 저장합니다. 기본값은 이미 시그니처에 있으므로Counter.new(),Counter.new(5)및Counter.new(5, 2)를 모두 사용할 수 있습니다.tick()은step을value에 더합니다.plus(other)는 GDScript에서 정의할 수 없는+연산자를 대체합니다. 두 값의 합을 값으로 하고 이 카운터의 단계 크기를 단계로 갖는 새로운Counter를 반환합니다. 어느 카운터도 변경되지 않습니다.equals(other)는 두 카운터의 값이 같을 때true를 반환합니다.
제공된 코드는 카운터 a와 b를 만드는 두 줄(빈 줄, START 또는 START STEP)을 읽은 다음, a와 b를 몇 번 틱할지 나타내는 한 줄을 읽습니다. 두 카운터와 그 합, 값이 같은지 여부, 그리고 a == b인지 여부를 출력합니다. 줄이 5, 2 3, 3 1일 때 다음을 출력합니다.
a: 8 (step 1)
b: 5 (step 3)
a plus b: 13 (step 1)
same value: false
same object: false코드는 counter.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 수정하지 말고 그대로 두세요
var a := make_counter(OS.read_string_from_stdin())
var b := make_counter(OS.read_string_from_stdin())
var ticks := OS.read_string_from_stdin().split(" ")
for i in int(ticks[0]):
a.tick()
for i in int(ticks[1]):
b.tick()
print("a: %d (step %d)" % [a.value, a.step])
print("b: %d (step %d)" % [b.value, b.step])
var total := a.plus(b)
print("a plus b: %d (step %d)" % [total.value, total.step])
print("same value: %s" % a.equals(b))
print("same object: %s" % (a == b))
func make_counter(line: String) -> Counter:
var parts := line.split(" ", false)
if parts.is_empty():
return Counter.new()
if parts.size() == 1:
return Counter.new(int(parts[0]))
return Counter.new(int(parts[0]), int(parts[1]))
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러