티스토리 뷰

문자열 연결

 

문자열을 연결하는 다양한 방법들

 

1. String Operator (+, +=), String.Concat
2. String.Format
3. Interpolation (보간)
4. String.Join
5. StringBuilder

 

 

String Operator (+, +=), Concat

문자열 리터럴 방법이라고도 불리는 +연산자로 연결하는 방법은 string.Concat() 메서드를 사용하는 것과 동일한 방법이다. (Concat 메서드에 오버로드 함수들은 따로 정리해놓았다.)

 

Concat 메서드를 본다면 최대 4개의 문자열을 인수로 갖고 있다.

6개의 문자열을 연결한다면 반복문을 통해 첫 4개씩 엮어서 연결 후 남은 2개의 문자열과 연결하게된다.

즉, 4개 이상의 연결에는 추가 연산을 요구하게 된다.

 

따라서 문자열 수가 적고 크기가 크지 않다면 +연산자의 성능은 충분하다.

단, +연산자가 아닌 +=연산자라면 낱개로 연산되기에 위와 같이 동작하지 않는다.

 

또 다른 특징은 연산 후 기존 문자열을 반환하는 것이 아닌 새로운 문자열을 메모리에 할당하여 반환하기에 문자열 생성, 초기화 과정을 반드시 걸쳐간다.

 

string1 + " " + string2 + " " + string3 + " " + string4 + " " + string5;

 

 

String.Format

string.Format은 내부적으로 StringBuilder 객체를 생성하여 처리한다.

 

string.Format은 각 나라별 Localize와 포맷에 맞는 대입 과정이 추가적으로 들어간다. 이에 비용이 추가적으로 들어가서 더 느리기도 하다.

 

string.Format은 대다수 오버로드 함수가 Object 타입을 매개변수로 받기에 자연스럽게 박싱이 일어날 수 도 있다. 하여 미리 ToString()으로 형변환을 해주는 것도 좋다.

 

string.Format()은 StringBuilder.AppendForat() 메서드와 함께 string.FormatHelper() 메서드의 내부 메서드를 통해 StringBuilder.Append()를 처리한다. 이때 string.Format()은 StringBuilder 객체를 하나 생성하여 넘겨주고 StringBuilder.AppendFormat()은 자기자신을 넘겨주어 새로운 객체를 생성하지 않는다.

모노와 닷넷 환경에 따라 다르게 동작하기도 한다.
닷넷 환경에서는 StringBuilder.AppendFormat()이 string.ForamtHelper()로 넘겨주지 않고 내부에서 자체 처리한다.
string.Format()도 StringBuilder.AppendFormat()으로 넘겨 처리하게 되어있다.

최신버전 모노는 닷넷과 같은 방식으로 바뀌었다.
string.Format("{0} {1} {2} {3} {4}", string1, string2, string3, string4, string5);

 

 

Interpolation (보간)

C# 6.0에서 추가된 문자열 보간기능은 $ 특수문자로 문자열 리터럴과 식별된다.

보간 문자열이란 보간 식으로 포함될 수 있는 문자열 리터럴이다.

 

보간 방식은 string.Format() 이나 string.Concat() 같은 메서드를 사용하지 않지만 기능이 동일하여 편리하게 출력하는 서식을 정할 수 있다.

 

구성요소 설명
interpolationExpression 서식을 지정할 결과를 생성하는 식
null = string.Empty로 표현
alignment 식 결과의 문자열의 여백을 주는 구성요소
양수 : 왼쪽 여백
음수 : 오른쪽 여백
formatString 식 결과의 형식을 기준으로 지원되는 서식 문자열
(날짜 및 시간, 열거형, 숫자 형식, Guid, TimeSpan 등)
공식문서

 

using System;

public class HelloWorld
{
	public static void Main()
    {
        Console.WriteLine($"@{"왼쪽",-7}@{"오른쪽",7}@");

        const int align = 20;
        Console.WriteLine($"{Math.PI,align} - 원주율 기본 형식");
        Console.WriteLine($"{Math.PI,align:F3} - 원주율 소수점 셋째자리까지 형식");
    }
}
@왼쪽     @    오른쪽@
3.14159265358979 - 원주율 기본 형식
               3.142 - 원주율 소수점 셋째자리까지 형식

 

 

string.Join

string.Join() 메서드는 배정 받은 문자열 집합을 연결하는 방법으로 상당히 빠른 속도를 제공한다.

 

string.Join() 은 대용량의 데이터가 입력될 경우 내부적으로 문자열을 따로 조작하지 않기에 복사 및 재할당 작업이 증가하게 되지만 여전히 내부버퍼를 활용하여 결과물을 도출하기 때문에 상당히 빠른 속도를 제공한다.

개수가 작은 데이터는 확실히 성능을 보장하기도 한다.

 

string.Join(" ", string1, string2, string3, string4, string5);

 

 

StringBuilder

StringBuilder는 배정 받은 문자열 집합을 연결하는 방법으로 가장 효율적이고 빠른 속도를 제공한다.

 

이는 StringBuilder의 다음 특징들 때문이다.

  1. 가변 크기의 내부 버퍼를 사용
  2. Append 연산으로 복사나 재할당을 하지 않음
  3. 버퍼의 크기를 필요에 따라 조정하여 재할당을 최소화
  4. 문자열 조작이 완료되면 ToString으로 최종 문자열 생성. 최종 문자열 데이터를 합쳐 반환

 

이러한 과정으로 StringBuilder는 가장 효율적인 문자열 연결 방법을 제공한다.

StringBuilder builder = new StringBuilder();
builder.Append(string1);
builder.Append(" ");
builder.Append(string2);
builder.Append(" ");
builder.Append(string3);
builder.Append(" ");
builder.Append(string4);
builder.Append(" ");
builder.Append(string5);
return builder.ToString();

 

 


예제코드

using System.Text;

public class SingleLineJoin
{
    public string string1 = "a";
    public string string2 = "b";
    public string string3 = "c";
    public string string4 = "d";
    public string string5 = "e";
	
	// 리터럴
    public string PlusOperator()
    {
        return string1 + " " + string2 + " " + string3 + " " + string4 + " " + string5;
    }

    // Format
    public string StringFormat()
    {
        return string.Format("{0} {1} {2} {3} {4}", string1, string2, string3, string4, string5);
    }

    // 보간
    public string Interpolation()
    {
        return $"{string1} {string2} {string3} {string4} {string5}";
    }

	// Concat
    public string StringConcatenate()
    {
        return string.Concat(string1, " ", string2, " ", string3, " ", string4, " ", string5);
    }

	// Join
    public string StringJoin()
    {
        return string.Join(" ", string1, string2, string3, string4, string5);
    }

	// StringBuilder
    public string StringBuilderAppend()
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(string1);
        builder.Append(" ");
        builder.Append(string2);
        builder.Append(" ");
        builder.Append(string3);
        builder.Append(" ");
        builder.Append(string4);
        builder.Append(" ");
        builder.Append(string5);
        return builder.ToString();
    }
}

 

 


결론

  • 문자열이 4개 이하로 짧으면 보간이나 문자열 리터럴 방법도 상관없다.
  • String.Format은 각 나라별 로컬라이징까지 수행하여 느리긴 하다.
  • 대부분 상황에서 StringBuilder가 좋다.
  • string.Join은 성능은 확실히 빠르지만 대규모 데이터 처리에는 살짝 느려진다.

 

 


참고자료

 

여러 문자열 연결 방법(C# 가이드)

C#에서 문자열을 연결하는 데는 여러 방법이 있습니다. 서로 다른 선택의 옵션과 이유에 대해 알아보세요.

learn.microsoft.com

 

 

C#에서 문자열 연결

이 문서에서는 C#에서 문자열을 연결하는 다양한 기술을 보여줍니다. 1. 사용 String.Concat() 방법 여러 문자열을 함께 연결하는 간단한 솔루션은 다음을 사용하는 것입니다. String.Concat() 방법. 이것

www.techiedelight.com

 

 

2. C#에서 문자열 연결(이어붙이기)의 성능에 대한 이야기

C#에서는 문자열을 처리하기 위한 여러가지 방법이 있습니다. 흔히 수행속도측면의 성능과 관련해서 이야기를 할때는 문자열끼리 붙이는(Concat) 작업으로 비교를 많이합니다. 문자열끼리 붙이는

asta8080.tistory.com

 

그때는 맞고 지금은 틀리다 - 문자열 연결 시에 가장 효율적인 방법은 StringBuilder가 아닐 수도 있

StringBuilder.AppendFormat()에 대한 설명에 잘못된 점이 있어 수정했습니다. (2018.9.1)

overworks.github.io

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함