0Pricing
C# Academy · 강의

제네릭 메서드

메서드에 형식 매개변수를 사용해 보세요.

제네릭 메서드은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

제네릭 메서드란 무엇인가요

제네릭 메서드는 하나 이상의 자체 형식 매개 변수를 선언하며, 메서드 이름 뒤의 꺾쇠괄호 안에 작성합니다. 그러면 같은 메서드 본문을 캐스팅이나 중복 없이 여러 형식에 사용할 수 있습니다.

형식 매개 변수는 T와 같은 자리 표시자입니다. 컴파일러는 호출 위치에서 실제 형식으로 대체하여 모든 항목을 강한 형식으로 유지합니다.

void Print<T>(T value)
{
    Console.WriteLine(value);
}

형식 매개 변수 선언

형식 매개 변수 목록 <T>는 메서드 이름과 매개 변수 목록 사이에 위치합니다. 본문 안에서 T를 매개 변수 형식, 반환 형식 또는 지역 변수 형식으로 사용할 수 있습니다.

일반적으로 형식 매개 변수가 하나이면 T라는 이름을 사용하며, TKey처럼 의미를 설명하는 이름도 흔히 사용합니다.

T Echo<T>(T input)
{
    return input;
}

형식 추론을 사용한 호출

일반적으로 형식 인수를 명시적으로 지정하지 않습니다. 컴파일러는 전달한 인수에서 T를 추론합니다.

여기서 Echo(42)는 T = int를 추론하고, Echo("hi")는 T = string을 추론합니다. 형식 추론을 사용하면 제네릭 호출을 깔끔하고 읽기 쉽게 유지할 수 있습니다.

using System;

class Program
{
    static T Echo<T>(T input) => input;

    static void Main()
    {
        Console.WriteLine(Echo(42));
        Console.WriteLine(Echo("hi"));
    }
}

명시적 형식 인수

추론으로 형식을 결정할 수 없거나 명시적으로 지정하려는 경우에는 호출 위치에서 꺾쇠괄호 안에 형식 인수를 제공합니다.

어떤 인수에도 형식이 포함되지 않는 경우에는 이것이 필요합니다. 예를 들어 T가 반환 형식에만 나타나는 메서드가 이에 해당합니다.

T Create<T>() where T : new() => new T();

// call:
var list = Create<int>();

여러 형식 매개변수

제네릭 메서드는 쉼표로 구분된 여러 형식 매개변수를 선언할 수 있습니다. 각 매개변수는 독립적으로 추론하거나 제공할 수 있습니다.

대표적인 예로 서로 다른 두 형식의 값을 교환하거나 쌍을 만드는 메서드를 들 수 있습니다.

(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
    return (b, a);
}

제네릭 값 교환

제네릭 메서드는 구체적인 형식을 신경 쓰지 않는 유틸리티에 특히 유용합니다. 값 교환 메서드는 서로 일치하는 어떤 형식의 두 값이든 순서를 바꿉니다.

ref 키워드를 사용하면 메서드가 호출자의 변수를 제자리에서 수정할 수 있습니다.

using System;

class Program
{
    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    static void Main()
    {
        int x = 1, y = 2;
        Swap(ref x, ref y);
        Console.WriteLine($"{x} {y}");
    }
}

메서드 매개변수의 제약 조건

제네릭 메서드는 where 절을 사용해 형식 매개변수에 제약을 둘 수 있습니다. 제약 조건은 컴파일러에 T에서 허용되는 연산을 알려 줍니다.

아래의 where T : IComparable<T>를 사용하면 본문에서 CompareTo를 안전하게 호출할 수 있습니다.

T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) >= 0 ? a : b;
}

비제네릭 클래스의 제네릭 메서드

클래스가 제네릭 메서드를 포함하기 위해 제네릭일 필요는 없습니다. 정적 유틸리티 클래스에 제네릭 메서드를 넣는 경우가 많습니다.

이렇게 하면 전체 클래스에 형식 매개변수를 지정하지 않고도 범용 도우미를 한곳에 모을 수 있습니다.

static class Util
{
    public static T First<T>(T[] items) => items[0];
}

배열에서의 추론

형식 추론은 배열과 컬렉션 인수를 통해서도 이루어집니다. int[]를 전달하면 자동으로 T = int를 추론합니다.

덕분에 제네릭 알고리즘이 언어에 기본 제공되는 기능처럼 느껴집니다.

using System;

class Program
{
    static T First<T>(T[] items) => items[0];

    static void Main()
    {
        int[] nums = { 10, 20, 30 };
        Console.WriteLine(First(nums));
    }
}

그냥 object를 사용하면 안 되나요?

제네릭이 도입되기 전에는 object와 캐스팅을 사용했습니다. 이렇게 하면 형식 안전성을 잃고 값 형식을 박싱하므로 성능이 저하됩니다.

제네릭 메서드는 값 형식의 박싱을 방지하고, 형식 오류를 실행 시간에 발생시키는 대신 컴파일 시간에 발견합니다.

// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);

서로 다른 형식 반환하기

반환 형식 자체를 제네릭으로 만들 수 있으므로, 하나의 메서드가 호출자에 맞춰 출력 형식을 결정할 수 있습니다. default(T)는 값 형식의 0 값을 반환하고 참조 형식에는 null을 반환합니다.

값을 사용할 수 없을 때 안전한 대체값을 제공하는 데 유용합니다.

T OrDefault<T>(bool ok, T value)
{
    return ok ? value : default(T);
}

빠른 확인

제네릭 메서드에 대한 이해도를 확인해 보십시오.

정리

제네릭 메서드는 이름 뒤의 꺾쇠괄호 안에 자체 형식 매개변수를 선언합니다. 컴파일러는 보통 인수에서 형식을 추론하지만, 형식을 명시적으로 제공할 수도 있습니다.

제네릭 메서드는 형식 안전성을 유지하고 박싱을 방지하며 where 제약 조건을 포함할 수 있습니다. 제네릭 클래스든 아니든 어떤 클래스에나 배치할 수 있습니다.

자주 묻는 질문

“제네릭 메서드” 강의는 무료인가요?

네 — “제네릭 메서드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“제네릭 메서드”에서 뭘 배우나요?

메서드에 형식 매개변수를 사용해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“제네릭 메서드” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 제네릭 메서드
  2. 제네릭 클래스
  3. where 제약
  4. 제네릭 인터페이스
← C# Academy(으)로 돌아가기