인터페이스 설계
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 *= factorCircle도 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()각 인터페이스는 한 가지 역할에 속하는 몇 개의 메서드만 포함하도록 작게 유지하세요. 이를 확장하는 클래스는 필요한 메서드만 작성하면 됩니다.
챌린지
쉬움인터페이스를 중심으로 미디어 플레이어를 만드세요.
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())
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러