Menu
CoddyTech

공개 및 비공개 멤버

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

캡슐화란 객체가 데이터를 변경하는 메서드와 데이터를 함께 보관하고, 다른 코드가 객체의 어떤 멤버를 사용할 수 있는지 결정하는 것을 의미합니다. 다른 코드에서 사용하도록 마련된 멤버들이 객체의 인터페이스를 구성합니다.

GDScript에는 public 또는 private 키워드가 없습니다. 모든 멤버에 외부에서 접근할 수 있습니다. Godot 스타일 가이드에서는 비공개 멤버 앞에 밑줄을 붙입니다.

# bank_account.gd
class_name BankAccount
extends RefCounted

var owner_name: String
var _balance: int = 0
var _history: Array[String] = []

func _init(holder: String) -> void:
	owner_name = holder

func deposit(amount: int) -> void:
	_balance += amount
	_record("deposit %d" % amount)

func get_balance() -> int:
	return _balance

func _record(entry: String) -> void:
	_history.append(entry)

owner_name, deposit() 및 get_balance()는 공개되어 있으므로 main.gd에서 사용합니다. _balance, _history 및 _record()는 비공개입니다. bank_account.gd 내부의 코드만 이를 사용합니다.

# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70

밑줄은 관례일 뿐, 잠금 장치가 아닙니다. main.gd의 account._balance = 1000000은 오류 없이 실행됩니다. 그래도 이 관례를 따르세요. 클래스에서 _balance를 변경하는 경우에만 잘못된 잔액이 발생할 수 있으므로, 확인해야 할 파일은 bank_account.gd 하나뿐입니다.

GDScript에는 protected 수준도 없습니다. 하위 클래스는 비공개 멤버까지 포함해 모든 멤버를 상속하므로, BankAccount를 extends하는 SavingsAccount는 자체 메서드에서 _balance를 사용할 수 있습니다.

_init() 및 _ready()와 같은 Godot의 가상 메서드도 밑줄로 시작합니다. Godot가 이를 대신 호출하므로, 비공개 메서드에 같은 이름을 붙이지 마세요.

challenge icon

챌린지

쉬움

hero.gd의 Hero 클래스를 완성하세요. 공개 멤버는 hero_name, gain_xp(), get_xp() 및 get_level()입니다. 나머지는 비공개입니다:

  • 비공개 변수 _xp(초깃값 0)와 _level(초깃값 1)을 추가하세요.
  • 비공개 메서드 _update_level()을 추가하세요. 이 메서드는 _level을 1 + _xp / 100(정수 나눗셈)으로 설정합니다.
  • gain_xp(amount)는 amount를 _xp에 더하고, _update_level()을 호출한 다음 레벨이 올랐으면 true를, 그렇지 않으면 false를 반환합니다.
  • get_xp()와 get_level()은 비공개 값을 반환합니다.

제공된 코드는 영웅의 이름을 읽고, 이어서 XP 양이 몇 개 입력되는지 읽은 다음, 한 줄에 하나씩 양을 읽습니다. 각 양을 처리한 뒤 gain_xp()가 true를 반환하면 Level up! 줄을 출력하고, 이어서 영웅의 상태를 출력합니다. Ada와 40, 70, 250을 입력하면 다음을 출력합니다:

Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4

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

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요
	var hero := Hero.new(OS.read_string_from_stdin())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var amount := int(OS.read_string_from_stdin())
		if hero.gain_xp(amount):
			print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
		print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
quiz icon실력 점검

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

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

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