Menu
CoddyTech

읽기 전용 속성

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

일부 값은 외부에서 읽을 수 있어야 하지만, 절대로 할당되어서는 안 됩니다. 객체가 생성될 때 한 번 지정되는 ID나 면적 또는 합계처럼 다른 데이터로부터 계산된 값이 이에 해당합니다. get 블록은 있고 set 블록은 없는 속성이 바로 그런 역할을 합니다.

# ticket.gd
class_name Ticket
extends RefCounted

var _number: int
var number: int:
	get:
		return _number

func _init(start_number: int) -> void:
	_number = start_number

생성자는 값을 비공개 _number에 저장하고, 공개된 number는 그 값을 반환하기만 합니다. 외부에서 number에 값을 할당해도 오류는 발생하지 않지만, 게터가 계속 _number를 반환하므로 아무것도 바뀌지 않습니다:

var ticket := Ticket.new(42)
ticket.number = 7
print(ticket.number) # 42

계산된 속성에는 자체 값이 없습니다. getter는 읽을 때마다 값을 계산하므로, 항상 그 값의 원본이 되는 데이터와 일치합니다.

# room.gd
class_name Room
extends RefCounted

var width: int = 4
var length: int = 5
var area: int:
	get:
		return width * length
var room := Room.new()
print(room.area) # 20
room.width = 6
print(room.area) # 30

일반적인 var area는 width나 length가 바뀔 때마다 직접 업데이트해야 하며, 한 번이라도 업데이트를 빠뜨리면 잘못된 값으로 남습니다. 계산된 area는 오래된 값이 될 수 없고, 누구도 여기에 잘못된 값을 할당할 수 없습니다.

모든 객체에서 동일하고 절대 변하지 않는 값에는 클래스의 상수를 사용하세요: const MAX_GUESTS = 4. 상수에 값을 할당하면 프로그램이 실행되기 전에 오류가 보고됩니다.

challenge icon

챌린지

쉬움

order.gd의 Order 클래스는 ID를 _id에, 각 항목의 합계(가격 곱하기 수량)를 _line_totals에 저장합니다. 네 개의 공개 속성에 get 블록을 사용해 읽기 전용으로 만드세요.

  • order_id는 _id를 반환합니다.
  • subtotal은 _line_totals의 합계를 반환합니다.
  • shipping은 소계가 50 이상이면 0을 반환하고, 그렇지 않으면 5를 반환합니다.
  • total은 소계와 배송비를 더한 값을 반환합니다.

제공된 코드는 주문 ID와 항목 수를 읽은 다음, 각 항목마다 price quantity 형식의 줄을 하나씩 읽습니다. 각 항목을 읽은 후 소계, 배송비, 합계를 출력합니다. 마지막에는 네 속성을 모두 0으로 설정하려고 한 다음 ID와 합계를 출력하며, 이 값들은 변경되지 않아야 합니다. ID가 7이고 항목이 12 2와 30 1일 때 다음을 출력합니다.

Subtotal 24, shipping 5, total 29
Subtotal 54, shipping 0, total 54
Order #7: 54

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

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 두세요
	var order := Order.new(int(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(" ")
		order.add_item(int(parts[0]), int(parts[1]))
		print("Subtotal %d, shipping %d, total %d" % [order.subtotal, order.shipping, order.total])
	# 읽기 전용 속성을 덮어쓰려고 시도하는 코드
	order.order_id = 0
	order.subtotal = 0
	order.shipping = 0
	order.total = 0
	print("Order #%d: %d" % [order.order_id, order.total])
quiz icon실력 점검

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

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

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