내부 클래스
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 41번째.
클래스는 class 키워드와 이름, 들여쓰기된 본문을 사용해 다른 클래스를 내부에 선언할 수 있습니다. 이 내부 클래스는 외부 클래스에 속하는 보조 형식입니다:
# inventory.gd
class_name Inventory
extends RefCounted
const MAX_STACK := 5
class Slot:
var item_name: String
var count: int
func _init(new_name: String, new_count: int) -> void:
item_name = new_name
count = mini(new_count, MAX_STACK)
func _to_string() -> String:
return "%s x%d" % [item_name, count]
var slots: Array[Slot] = []
func add(item_name: String, count: int) -> Slot:
var slot := Slot.new(item_name, count)
slots.append(slot)
return slotinventory.gd 안에서 내부 클래스는 Slot입니다. 다른 모든 파일은 외부 클래스를 통해 이 클래스에 접근합니다: Inventory.Slot.
# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots) # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)extends가 없는 내부 클래스는 RefCounted를 상속하며, 다른 클래스와 마찬가지로 변수, 생성자, 메서드를 가질 수 있습니다. 외부 클래스의 상수와 열거형(MAX_STACK 위)을 사용할 수 있지만, 외부 클래스의 멤버 변수는 사용할 수 없습니다. Slot은 별도의 객체이므로 slots에 접근할 수 없습니다. 필요한 값은 생성자에 전달하세요.
인벤토리의 슬롯이나 점수표의 항목처럼 바깥 클래스와 함께 있을 때만 의미가 있는 작은 타입에는 내부 클래스를 사용하세요. 게임의 다른 부분에서 독립적으로 사용하는 타입은 별도의 파일과 class_name을 사용하는 것이 좋습니다.
챌린지
쉬움항목이 내부 클래스인 Leaderboard를 만드세요.
Leaderboard안에 내부 클래스Entry를 선언하세요. 생성자에서player_name과score를 설정하고,_to_string()은Ada: 120을 반환해야 합니다.entries는Entry의 형식화된 배열이며, 플레이어가 처음 등장한 순서대로 정렬됩니다.submit(player, score)는 새 플레이어의 항목을 추가합니다. 이미 항목이 있는 플레이어라면 두 점수 중 더 높은 점수를 유지합니다.best()는 점수가 가장 높은 항목을 반환합니다. 동점이면 먼저 등장하는 항목이 선택됩니다.
제공된 코드는 뒤따르는 점수의 개수를 읽고(Ada 120), 점수를 제출한 다음 모든 항목과 최고 점수 항목을 출력합니다(점수는 항상 최소 하나 주어집니다). Ada 120, Bo 90, Ada 80, Bo 150, Cy 150의 경우 다음을 출력합니다:
Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150코드는 leaderboard.gd에 작성하세요. main.gd에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 그대로 유지하세요
var board := Leaderboard.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
board.submit(parts[0], int(parts[1]))
for entry in board.entries:
print(entry)
print("Best: ", board.best())
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러