Menu
CoddyTech

인터페이스 설계

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

인터페이스는 클래스가 구현을 제공하지 않고도 갖추기로 약속하는 메서드 목록입니다. Java와 C#에는 interface 키워드가 있지만, GDScript에는 없습니다. 모든 메서드가 추상 메서드인 추상 클래스로 같은 것을 만들 수 있습니다.

# drawable.gd
@abstract
class_name Drawable
extends RefCounted

@abstract func draw() -> String
@abstract func resize(factor: int) -> void

변수도 메서드 본문도 없습니다. 그릴 수 있는 대상이 무엇을 할 수 있는지 설명하고, 각 클래스가 그 방법을 결정합니다:

# banner.gd
class_name Banner
extends Drawable

var text: String
var size := 1

func _init(t: String) -> void:
	text = t

func draw() -> String:
	return "Banner '%s' at size %d" % [text, size]

func resize(factor: int) -> void:
	size *= factor

Circle도 Drawable을 확장할 수 있으며, radius와 자체 draw() 및 resize()를 가질 수 있습니다. 인터페이스를 사용하는 코드는 인터페이스에만 의존하므로, 나중에 작성된 클래스를 포함해 Drawable을 확장하는 모든 클래스와 함께 작동합니다:

func render_all(items: Array[Drawable]) -> void:
	for item in items:
		item.resize(2)
		print(item.draw())
var items: Array[Drawable] = [Banner.new("Sale"), Circle.new(3)]
render_all(items)
Banner 'Sale' at size 2
Circle with radius 6

클래스에는 부모가 하나 있으므로 인터페이스 하나만 확장할 수 있습니다. 클래스가 파일에 저장되는 것처럼 두 번째 역할을 수행할 때는 기본 인터페이스를 확장하고 has_method()로 두 번째 역할을 확인하세요:

if item.has_method("save"):
	item.save()

각 인터페이스는 한 가지 역할에 속하는 몇 개의 메서드만 포함하도록 작게 유지하세요. 이를 확장하는 클래스는 필요한 메서드만 작성하면 됩니다.

challenge icon

챌린지

쉬움

인터페이스를 중심으로 미디어 플레이어를 만드세요.

  • playable.gd에서 Playable을 인터페이스로 만드세요. 추상 메서드 play() -> String과 duration() -> int(초 단위)를 가진 추상 클래스입니다.
  • Song은 Playable을 상속합니다. play()는 Playing song: TITLE by ARTIST를 반환하고, duration()은 초를 반환합니다.
  • Video는 Playable을 상속합니다. play()는 Playing video: TITLE in RESOLUTIONp를 반환하고(예: in 1080p), duration()은 초를 반환합니다.
  • Playlist는 Playable만 알고 있습니다. play_all()은 모든 항목의 play()를 출력하고, total_time()은 합산한 재생 시간을 M:SS 형식으로 반환합니다(초는 두 자리로 표시하며, 예: 4:05).

Song과 Video의 생성자는 작성되어 있습니다. 제공된 코드는 이어지는 항목의 개수를 읽은 다음, 항목마다 한 줄씩 읽습니다: song TITLE ARTIST SECONDS 또는 video TITLE RESOLUTION SECONDS. 코드는 play_all()을 호출하고 총 재생 시간을 출력합니다. song Imagine Lennon 183과 video Trailer 1080 95에 대해 다음을 출력합니다:

Playing song: Imagine by Lennon
Playing video: Trailer in 1080p
Total time: 4:38

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

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요
	var count := int(OS.read_string_from_stdin())
	var playlist := Playlist.new()
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "song":
			playlist.add(Song.new(p[1], p[2], int(p[3])))
		else:
			playlist.add(Video.new(p[1], int(p[2]), int(p[3])))
	playlist.play_all()
	print("Total time: " + playlist.total_time())
quiz icon실력 점검

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

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

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