Menu
CoddyTech

관례상 비공개

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()은 여러분의 코드가 아니라 엔진이 호출합니다.

challenge icon

챌린지

쉬움

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")
quiz icon실력 점검

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

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

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