Menu
CoddyTech

컴포지션과 상속 비교

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

클래스는 두 가지 방식으로 코드를 재사용합니다. 상속(extends)은 클래스가 다른 클래스의 한 종류임을 나타냅니다. 즉, Mage는 Player입니다. 컴포지션은 클래스가 어떤 부분을 가진다는 뜻입니다. 멤버 변수에 다른 객체를 저장하고 그 객체에 작업을 맡깁니다:

# motor.gd
class_name Motor
extends RefCounted

func start() -> String:
	return "motor running"

# car.gd
class_name Car
extends RefCounted

var motor := Motor.new()

func start() -> String:
	return "Car starts, " + motor.start()

Car.new().start()는 Car starts, motor running을 반환합니다. 자동차는 모터가 어떻게 작동하는지 알지 못합니다. motor.start()를 호출합니다. 이처럼 부품에 호출을 맡기는 것을 위임이라고 합니다. (클래스 이름이 Motor인 이유는 Engine이 이미 Godot 클래스이기 때문입니다.)

구성은 구성 요소가 바뀌거나 결합될 때 효과를 발휘합니다. 상속을 사용하면 걷는 캐릭터와 나는 캐릭터는 두 개의 하위 클래스이며, 날기 시작하는 박쥐도 클래스를 바꿀 수 없습니다. 구성에서는 캐릭터가 이동 구성 요소를 가지며, 이를 바꾸는 것은 할당 한 번이면 됩니다:

# character.gd
class_name Character
extends RefCounted

var char_name: String
var movement: Movement

func _init(new_name: String, new_movement: Movement) -> void:
	char_name = new_name
	movement = new_movement

func move() -> String:
	return char_name + " " + movement.move()

# main.gd
var bat := Character.new("Bat", Walk.new())
print(bat.move()) # Bat가 걷는다
bat.movement = Fly.new()
print(bat.move()) # Bat가 난다

여기서 Walk와 Fly는 작은 Movement 클래스를 확장합니다. 두 기술은 함께 작동합니다. GDScript 클래스는 하나의 클래스만 extend할 수 있으므로, 여러 부분을 보유하여 하나의 객체가 여러 능력을 갖게 하는 방법으로 컴포지션을 사용할 수도 있습니다.

절대 변하지 않는 실제적인 "이다" 관계에는 상속을 사용하세요. 클래스가 무언가를 "가지고" 있거나 게임이 실행되는 동안 구성 요소를 교체해야 할 때는 컴포지션을 사용하세요.

challenge icon

챌린지

쉬움

기사는 무기를 상속하지 않습니다. 기사는 무기를 가지고 있으며, 무기를 바꿀 수 있습니다. 두 클래스를 만드세요.

  • Weapon은 weapon_name과 damage를 저장하며, 둘 다 생성자로 설정됩니다: Weapon.new("Sword", 7).
  • Knight는 생성자에서 받은 knight_name과 무기를 저장하며, 무기는 처음에 null입니다.
  • equip(new_weapon)은 무기를 교체하고 drop()은 무기를 다시 null로 설정합니다.
  • attack()은 기사의 이름과 무기의 이름 및 공격력을 사용해 Ada attacks with Sword for 7 damage을 반환하거나, 무기가 없을 때는 Ada has no weapon을 반환합니다.

제공된 코드는 기사의 이름과 이어지는 명령의 개수(equip Sword 7, drop, attack)를 읽고 명령을 실행합니다. Ada와 attack, equip Sword 7, attack, equip Axe 12, attack, drop, attack을 입력하면 다음을 출력합니다:

Ada has no weapon
Equipped Sword
Ada attacks with Sword for 7 damage
Equipped Axe
Ada attacks with Axe for 12 damage
Dropped the weapon
Ada has no weapon

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

직접 해보기

extends Node

func _ready():
	# 제공된 입력/출력 코드: 그대로 유지하세요
	var knight := Knight.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] == "equip":
			knight.equip(Weapon.new(parts[1], int(parts[2])))
			print("Equipped ", parts[1])
		elif parts[0] == "drop":
			knight.drop()
			print("Dropped the weapon")
		else:
			print(knight.attack())
quiz icon실력 점검

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

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

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