Menu
Coddy logo textTech

제네릭 소개

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

Go 1.18 이전에는 다양한 타입에 사용할 수 있는 재사용 가능한 코드를 작성하려면 함수를 복제하거나 빈 인터페이스 any와 타입 단언을 사용해야 했습니다. 제네릭은 여러 타입에서 작동하면서도 완전한 타입 안전성을 유지하는 함수와 타입을 작성할 수 있게 하여 이 문제를 해결합니다.

slice에서 최솟값을 찾는 것을 생각해 보세요. 제네릭이 없다면 각 type마다 별도의 함수를 작성해야 합니다:

func MinInt(values []int) int {
    min := values[0]
    for _, v := range values {
        if v < min {
            min = v
        }
    }
    return min
}

func MinFloat64(values []float64) float64 {
    min := values[0]
    for _, v := range values {
        if v < min {
            min = v
        }
    }
    return min
}

제네릭을 사용하면 대괄호 안의 type parameter를 사용하여 로직을 한 번만 작성합니다:

func Min[T int | float64](values []T) T {
    min := values[0]
    for _, v := range values {
        if v < min {
            min = v
        }
    }
    return min
}

[T int | float64]int 또는 float64 중 하나일 수 있는 타입 매개변수 T를 선언합니다. 이제 동일한 함수로 Min([]int{3, 1, 2}) 또는 Min([]float64{3.5, 1.2})를 호출할 수 있습니다. 컴파일러가 컴파일 시점에 타입을 검사하므로 런타임 오버헤드 없이 안전성을 확보할 수 있습니다.

다음 강의에서는 type 매개변수, 제약 조건, 그리고 generic 구조체를 자세히 살펴봅니다.

challenge icon

챌린지

쉬움

generic을 사용하여 정수 점수와 부동 소수점 점수 모두에서 작동하는 점수 분석기를 만들어 봅시다! slice에서 maximum 값을 찾는 하나의 generic function을 만들어 서로 다른 숫자 유형에 대한 중복 코드를 없애게 됩니다.

코드를 두 파일로 구성합니다.

  • analyzer.go: generic analysis function을 정의합니다.

    slice에서 maximum 값을 찾아 반환하는 generic function Max[T int | float64](values []T) T을 만드세요. 이 function은 type parameter T를 통해 intfloat64 유형 모두에서 작동해야 합니다.

    또한 slice의 all values의 sum을 calculates하고 반환하는 generic function Sum[T int | float64](values []T) T을 만드세요.

  • main.go: 입력을 읽고 서로 다른 유형으로 generic functions를 시연합니다.

    type indicator(int 또는 float)를 읽은 다음, count와 그만큼의 values를 읽습니다. 유형에 따라 values를 구문 분석하고, 적절한 유형으로 MaxSum을 모두 Call한 다음 results를 출력합니다.

    integer 입력의 경우 다음을 출력합니다.

    Max (int): [value]
    Sum (int): [value]

    float 입력의 경우 소수점 한 자리까지 출력합니다.

    Max (float): [value]
    Sum (float): [value]

다음 입력이 제공됩니다.

  • Line 1: Type indicator(int 또는 float)
  • Line 2: values의 count(정수)
  • Following lines: line당 하나의 value

예를 들어 다음이 주어졌을 때:

int
4
15
8
23
11

출력은 다음과 같아야 합니다.

Max (int): 23
Sum (int): 57

또한 다음이 주어졌을 때:

float
3
4.5
9.2
6.8

출력은 다음과 같아야 합니다.

Max (float): 9.2
Sum (float): 20.5

동일한 generic functions가 integer 및 floating-point data 모두를 처리하는 방식을 확인하세요. type parameter [T int | float64]를 사용하면 logic을 한 번만 작성해도 compiler가 각 사용 사례에 대해 type-safe code를 생성할 수 있습니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 타입 표시자 읽기
	typeStr, _ := reader.ReadString('\n')
	typeStr = strings.TrimSpace(typeStr)

	// 개수 읽기
	countStr, _ := reader.ReadString('\n')
	count, _ := strconv.Atoi(strings.TrimSpace(countStr))

	if typeStr == "int" {
		// 정수 값 읽기
		values := make([]int, count)
		for i := 0; i < count; i++ {
			line, _ := reader.ReadString('\n')
			values[i], _ = strconv.Atoi(strings.TrimSpace(line))
		}

		// TODO: 정수 슬라이스로 Max와 Sum 호출
		// TODO: "Max (int): [value]" 및 "Sum (int): [value]" 형식으로 결과 출력

	} else if typeStr == "float" {
		// 실수 값 읽기
		values := make([]float64, count)
		for i := 0; i < count; i++ {
			line, _ := reader.ReadString('\n')
			values[i], _ = strconv.ParseFloat(strings.TrimSpace(line), 64)
		}

		// TODO: float64 슬라이스로 Max와 Sum 호출
		// TODO: 소수점 한 자리로 "Max (float): [value]" 및 "Sum (float): [value]" 형식으로 결과 출력
	}
}
quiz icon실력 점검

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

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

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