티스토리 뷰
[C#] 문자열 연결 방법 (+, Concat, Format, Interpolation, Join, StringBuilder)
HONGGG 2023. 8. 14. 19:31문자열 연결
문자열을 연결하는 다양한 방법들
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의 다음 특징들 때문이다.
- 가변 크기의 내부 버퍼를 사용
- Append 연산으로 복사나 재할당을 하지 않음
- 버퍼의 크기를 필요에 따라 조정하여 재할당을 최소화
- 문자열 조작이 완료되면 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은 성능은 확실히 빠르지만 대규모 데이터 처리에는 살짝 느려진다.
참고자료
'Computer Language > C#' 카테고리의 다른 글
[C#] 메모리 할당 (0) | 2023.08.15 |
---|---|
[C#] StringBuilder (0) | 2023.08.15 |
[C#] String.Remove 메서드 - 문자열 제거 (0) | 2023.08.14 |
[C#] String.Replace 메서드 - 문자열 수정 (0) | 2023.08.14 |
[C#] String.Join 메서드 - 문자열 붙이기 (0) | 2023.08.14 |
- Total
- Today
- Yesterday
- 운영체제
- malloc
- 컴파일
- 수학
- 입출력
- 포인터
- 클래스
- 상속
- 초기화
- New
- 구조
- 스레드
- 멀티스레드
- 크기
- const
- c++
- 프로세스
- CPU
- 알고리즘
- 백준
- 함수
- 메모리
- static_cast
- 게임수학
- 명령어
- dynamic_cast
- thread
- 할당
- 레지스터
- 인터럽트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |