Menu
Coddy logo textTech

다형성 컬렉션

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

인터페이스의 가장 강력한 활용 방법 중 하나는 서로 다른 타입을 동일한 컬렉션에 저장하는 것입니다. interface 타입의 슬라이스는 해당 interface를 충족하는 모든 값을 담을 수 있으므로, 서로 관련 있지만 다른 타입들을 함께 그룹화할 수 있습니다.

다양한 도형을 관리해야 하는 상황을 생각해 보세요. 각 유형마다 별도의 슬라이스를 사용하는 대신, 인터페이스 유형의 단일 슬라이스를 사용할 수 있습니다:

type Shape interface {
    Area() float64
}

type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return 3.14159 * c.Radius * c.Radius }

type Rectangle struct{ Width, Height float64 }
func (r Rectangle) Area() float64 { return r.Width * r.Height }

func main() {
    shapes := []Shape{
        Circle{Radius: 5},
        Rectangle{Width: 4, Height: 3},
        Circle{Radius: 2},
    }
    
    for _, s := range shapes {
        fmt.Printf("Area: %.2f\n", s.Area())
    }
}

shapes 슬라이스에는 원과 직사각형이 모두 포함됩니다. 반복할 때 각 요소는 실제 타입에 따라 Area()에 응답합니다. 이는 컬렉션에 적용된 다형성입니다. 동일한 루프가 모든 도형 타입을 일관되게 처리합니다.

다형성 컬렉션은 이메일과 SMS 메시지를 보내는 알림 시스템, 다양한 적 유형을 업데이트하는 게임, 또는 여러 파일 형식을 처리하는 문서 처리기처럼 서로 다른 항목을 처리하는 시스템을 구축할 때 필수적입니다. 컬렉션은 구체적인 유형에는 관심이 없으며, 각 요소가 필요한 동작만 제공하면 됩니다.

challenge icon

챌린지

쉬움

통합된 interface를 통해 다양한 유형의 작업을 처리하는 작업 관리 시스템을 만들어 보겠습니다. 여러 작업 유형을 만들고, 이를 모두 다형적 컬렉션에서 함께 처리합니다.

코드를 세 개의 파일로 구성합니다:

  • task.go: Summary() string method를 요구하는 Task interface를 Define합니다. 이 interface는 모든 작업 유형이 fulfill해야 하는 common contract입니다.
  • types.go: 각각 Task interface를 Implement하는 세 가지 서로 다른 작업 유형을 Create합니다:
    • BugFix: ID (string) 및 Severity (string) fields를 가집니다. 해당 Summary()Bug #[ID] ([Severity])를 반환합니다.
    • Feature: Name (string) 및 Points (int) fields를 가집니다. 해당 Summary()Feature: [Name] - [Points] pts를 반환합니다.
    • Documentation: Topic (string) field를 가집니다. 해당 Summary()Docs: [Topic]을 반환합니다.
  • main.go: Task 슬라이스를 accepts하고 각 작업의 요약을 own 줄에 출력하는 function PrintBacklog를 Create합니다. input에서 작업 세부 정보를 읽고, 각 작업 유형을 one씩 만들고, all 작업을 하나의 []Task 슬라이스로 collect한 다음 PrintBacklog에 전달합니다.

다음 input이 제공됩니다:

  • 1번째 줄: Bug ID
  • 2번째 줄: Bug severity
  • 3번째 줄: Feature name
  • 4번째 줄: Feature points (integer)
  • 5번째 줄: Documentation topic

예를 들어 1042, critical, Dark Mode, 8, API Reference가 주어지면 출력은 다음과 같아야 합니다:

Bug #1042 (critical)
Feature: Dark Mode - 8 pts
Docs: API Reference

여기서 중요한 점은 PrintBacklog에 bug, feature 또는 documentation에 대한 별도의 로직이 필요하지 않다는 것입니다. 이 function은 단순히 슬라이스를 반복하며 각 요소에서 Summary()를 호출합니다. each 작업 유형은 own 고유 형식으로 응답하며, 이는 다형적 컬렉션을 사용하면 다양한 유형을 균일하게 처리할 수 있음을 보여 줍니다.

직접 해보기

package main

import (
	"fmt"
)

// TODO: Task 슬라이스를 받는 PrintBacklog 함수를 만드세요
// 그리고 각 task의 summary를 한 줄씩 출력합니다

func main() {
	// 입력 읽기
	var bugID string
	var bugSeverity string
	var featureName string
	var featurePoints int
	var docTopic string

	fmt.Scanln(&bugID)
	fmt.Scanln(&bugSeverity)
	fmt.Scanln(&featureName)
	fmt.Scanln(&featurePoints)
	fmt.Scanln(&docTopic)

	// TODO: 각 task 유형(BugFix, Feature, Documentation)을 하나씩 만드세요

	// TODO: 모든 task를 하나의 []Task 슬라이스로 모으세요

	// TODO: task 슬라이스로 PrintBacklog를 호출하세요
}
quiz icon실력 점검

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

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

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