관례상 비공개
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 13번째.
GDScript에는 private 키워드가 없습니다. 객체의 모든 속성과 메서드는 다른 스크립트에서 접근할 수 있습니다. Godot에서는 이름 앞에 밑줄을 붙이는 관례를 따릅니다. 아래의 _coins와 _is_valid()는 클래스 자체의 코드에서만 사용하도록 의도되었습니다.
# wallet.gd
class_name Wallet
extends RefCounted
var _coins: int = 0
func add(amount: int) -> void:
if _is_valid(amount):
_coins += amount
func spend(amount: int) -> bool:
if not _is_valid(amount) or amount > _coins:
return false
_coins -= amount
return true
func get_coins() -> int:
return _coins
func _is_valid(amount: int) -> bool:
return amount > 0다른 스크립트는 공개 메서드를 사용하며, 이 메서드는 모든 변경 사항을 확인합니다. spend()는 지갑에 있는 것보다 더 많은 코인을 가져가지 않으므로 코인 수는 절대 0보다 작아지지 않습니다.
var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50밑줄은 약속이지, 잠금장치가 아닙니다. wallet._coins = -999는 오류 없이 실행됩니다. 그 약속을 지키는 것은 다른 스크립트를 작성하는 사람에게 달려 있으므로, 클래스 외부에서는 밑줄이 붙은 멤버를 읽거나 변경하지 마세요.
Godot 자체에서 사용하는 밑줄 이름 두 가지를 이미 알고 있습니다. _ready()와 _init()은 여러분의 코드가 아니라 엔진이 호출합니다.
챌린지
쉬움user.gd에서 User 클래스를 완성하세요. 이 클래스는 비공개 속성인 _password에 비밀번호를 저장하며, 클래스 자체의 코드만 이 속성에 접근합니다.
- 생성자는 시작 비밀번호를 저장합니다
check_password(attempt)는attempt가 비밀번호와 일치하는지 반환합니다- 비공개 보조 함수인
_is_strong(candidate)는candidate의 길이가 최소6자인지 반환합니다 change_password(old_password, new_password)는 비밀번호를 변경하고,old_password가 맞고new_password가 강력한 경우에만true를 반환합니다. 그렇지 않으면 아무것도 변경하지 않고false를 반환합니다
제공된 코드는 시작 비밀번호, 이어지는 명령의 개수, 그리고 check PASSWORD와 change OLD NEW 명령을 읽습니다. 비밀번호가 godot4이고 명령이 change godot4 abc, change wrong longenough, check godot4이면 다음을 출력합니다.
Password not changed
Password not changed
Access granted코드는 user.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 그대로 유지하세요
var user := User.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "check":
print("Access granted" if user.check_password(parts[1]) else "Access denied")
elif user.change_password(parts[1], parts[2]):
print("Password changed")
else:
print("Password not changed")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러