본문 바로가기
Development/C#

[내일배움캠프 16일차 TIL] 제네릭, out, ref, 문자열 빌더

by 식냥 2024. 5. 7.
728x90

 

 

[ 제네릭 ]

제네릭은 데이터 타입을 일반화해서 다양한 자료형에 대응할 수 있게 한다. <T>를 사용해서 특정 자료형 없이 선언한 뒤, 이를 사용할 때 원하는 자료형을 입력한다. 제네릭을 사용하면 코드를 재사용성을 높이고, 컴파일 오류를 줄여 타입 안전성을 제공한다.

 

public class Inventory<T>
{
    private T content;

    public void Put(T item)
    {
        content = item;
    }

    public T Get()
    {
        return content;
    }
}

제네릭 타입 <T>를 사용해서 특정 자료형을 미리 정의하지 않고 아이템을 저장하거나 꺼낼 수 있는 코드를 작성했다.

 

public class Program
{
    public static void Main()
    {
        Inventory<string> ItemName = new Inventory<string>();
        ItemName.Put("HP Potion");
        Console.WriteLine("Use Item: " + ItemName.Get());
    }
}

인벤토리 클래스를 사용할 때 string이라는 구체적인 자료형을 설정해서 문자열 데이터를 저장했다.

 

[ out, ref ]

out과 ref는 메서드에서 매개변수를 통해 값을 전달할 때 사용한다. out은 반환 값을 return이 아닌 매개변수를 통해서 바로 전달할 수 있게 하고, ref는 값에 직접 접근하여 실제 값을 변화를 줄 수 있게 한다.

 

out 예시

public class Calculator
{
    static void Main()
    {
        int number;	//초기화X
        PlusTwo(10, out number);	//할당
        Console.WriteLine("Plus Two: " + number);
    }

    static void PlusTwo(int n, out int number)
    {
        number = n + 2;
    }
}

위 코드에서 number 변수에 초기화하지 않고, PlusTwo 메서드를 사용할 때 매개변수를 통해 값을 할당한다. PlusTwo 메서드는 number 변수에 2를 더한 값을 반환한다.

 

ref 예시

public class Calculator
{
    static void Main()
    {
        int number = 10;	//초기화
        Console.WriteLine("Original number: " + number);
        PlusTwo(ref number);
        Console.WriteLine("Plus Two: " + number);
    }

    static void PlusTwo(ref int n)
    {
        n += 2;
    }
}

위 코드에서는 원래 값이 10인 number 변수를 PlusTwo 메서드에 ref 키워드를 통해 매개변수로 전달함으로써 실제 number의 값이 변화하도록 한다. 그래서 다음 줄에서 출력을 하면 10이 아닌 12가 출력된다.

 

[ 문자열 빌더 ]

문자열 빌더(StringBuilder)는 이미 할당된 문자열을 수정할 수 있도록 한다. 내부 메모리에서 동적으로 크기를 조절한다는 특징이 있다. 문자열 추가, 삽입, 제거, 교체 등이 있다.

 

public static void Main()
    {
        StringBuilder sb = new StringBuilder("안녕! 만나서 반가워.");

        // 전체 제거
        sb.Clear();

        // 추가
        sb.Append("반가워.");
        //출력 결과
        반가워.

        // 삽입
        sb.Insert(0, "안녕! ");
        //출력 결과
        안녕! 반가워.
        
        // 제거
        sb.Remove(2, 1);
        //출력 결과
        안녕 반가워.

        // 교체
        sb.Replace("안녕", "모두");
        //출력 결과
        모두 반가워.

        string sentence = sb.ToString();

        Console.WriteLine(sentence);
    }
  1. Append(string): 문자열 맨 뒤에 추가
  2. Insert(int, string): 지정한 인덱스에 문자열 삽입
  3. Remove(int, int): 첫 번째 인수의 인덱스에 두 번째 인수의 개수만큼 문자열 제거
  4. Replace(string, string): 첫 번째 인수의 문자열을 두 번째 인수의 문자열로 교체

 

[ 회고 ]

제네릭은 많이 사용되는 것을 봤어서 한 번 제대로 공부해야겠다는 생각을 하고 있었다. 어려워 보이는 것에 비해 생각보다 간단했고, 선언 당시에 자료형을 고정하지 않는다는 점에서 유용하게 사용할 수 있을 것 같다. out, ref는 어떻게 사용할 수 있을까 하는 생각이 들었었다. ref는 잘 모르겠지만 out은 돌이켜보니 꽤나 많이 사용을 했던 기억이 있어서 이제 정확한 사용법을 알고 적절한 때에 사용할 수 있을 것 같다. ref도 아직 사용해보지 않았을 뿐이지 새로운 변수를 생성하고 할당하지 않는다는 점에서 편리하게 사용할 수 있을 것 같다. 하지만 직접 변수에 접근해서 값을 변화하는 것을 지양하는 만큼 너무 많이 무분별하게 사용하면 안 된다는 점을 기억하고 있어야겠다.

728x90
반응형