인스턴스 변수와 정적 변수
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 9번째.
클래스의 일반 var는 인스턴스 변수입니다. 각 객체가 자체 변수를 가집니다. static var는 대신 클래스에 속합니다. 값이 하나만 있으며 모든 객체가 공유합니다.
# student.gd
class_name Student
extends RefCounted
static var school: String = "Godot High"
static var count: int = 0
var student_name: String
func _init(new_name: String) -> void:
student_name = new_name
count += 1var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada and Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot AcademyStudent.count처럼 클래스 이름을 통해 정적 변수를 읽으면 객체가 필요하지 않습니다. 클래스 내부에서는 클래스 이름을 사용하세요. _init()에서 count += 1은 지금까지 생성된 모든 학생을 셉니다.
Student.school을 변경하면 모든 학생의 값이 한 번에 바뀝니다. ada.school = "Night School"도 같은 결과를 냅니다. school은 하나뿐이기 때문입니다. 클래스 이름을 쓰면 이 점이 분명해집니다.
const도 같은 방식으로 공유되지만 절대 변경할 수 없습니다. 카운터나 모든 객체가 따르는 설정처럼 프로그램이 실행되는 동안 변경되는 공유 데이터에는 static var를 사용하세요.
챌린지
쉬움다음과 같이 bank_account.gd의 BankAccount 클래스를 완성하세요:
- 모든 계정이 공유하며
2로 시작하는 정적int변수interest_percent 0으로 시작하는 정적int변수account_count; 생성자는 새 계정이 만들어질 때마다 여기에1을 더합니다describe()는 계정의holder와balance, 그리고 공유되는interest_percent를 사용해HOLDER: $BALANCE at PERCENT%를 반환합니다
제공된 코드는 이어지는 계정 수와 각 계정의 holder balance 한 줄을 읽은 다음, 새 이자율을 읽습니다. BankAccount.account_count와 모든 계정을 출력하고, BankAccount.interest_percent를 새 이자율로 설정한 다음 모든 계정을 다시 출력합니다. Alice 1000, Bob 2000과 이자율 3을 입력하면 다음을 출력합니다:
Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%코드는 bank_account.gd에 작성하세요. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 그대로 유지하세요
var accounts: Array[BankAccount] = []
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
accounts.append(BankAccount.new(parts[0], int(parts[1])))
print("Accounts opened: %d" % BankAccount.account_count)
for account in accounts:
print(account.describe())
BankAccount.interest_percent = int(OS.read_string_from_stdin())
print("After the rate change:")
for account in accounts:
print(account.describe())
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러