[궁금시리즈] 1-5. string과 String은 무엇이 다를까?

2 minute read

C#을 공부하다 보면 다음 두 가지 코드를 모두 볼 수 있다.

string message = "Hello";

그리고

String message = "Hello";

처음 보면 누구나 이런 의문이 든다.

“둘 중 하나는 잘못된 문법 아닌가?” “string이 최신 문법인가?” “성능 차이가 있는 걸까?”

결론부터 말하면

string과 String은 완전히 같은 타입이다.

성능 차이도 없고, 내부적으로도 동일한 객체를 가리킨다.

그렇다면 왜 두 가지 표기법이 존재하는지 알아보자.  

string은 키워드이다

먼저 string은 C# 언어가 제공하는 예약어(keyword) 이다.

예를 들어

int
bool
float
double
string
char

모두 C# 키워드이다.

컴파일러는 이러한 키워드를 보면 내부적으로 .NET 타입으로 변환한다.

예를 들어

string name = "Tom";

컴파일러는 이를 다음과 같이 해석한다.

System.String name = "Tom";

즉, string은 System.String의 별칭(alias)이다.  

String은 클래스이다

반면

String

은 실제 .NET이 제공하는 클래스이다.

정확한 이름은

System.String

이다.

즉,

string

System.String

BCL(Base Class Library) 정의된 클래스

라는 관계를 가진다.   정말 같은 타입일까?

다음 코드를 보자.

string text1 = "Hello";
String text2 = "World";

둘의 타입을 출력해 보면

Console.WriteLine(text1.GetType());
Console.WriteLine(text2.GetType());

결과는

System.String
System.String

이다.

즉, 두 변수 모두 같은 타입이다.  

IL 코드도 동일하다

다음 두 코드는

string message = "Hello";

String message = "Hello";

컴파일 이후 생성되는 IL도 동일하다.

즉, 컴파일러 입장에서는 두 코드의 차이가 전혀 없다.  

다른 기본 타입도 모두 동일하다

문자열만 특별한 것이 아니다. C#의 기본 타입은 모두 .NET 타입의 별칭이다.

C# 키워드 실제 타입
bool System.Boolean
byte System.Byte
char System.Char
short System.Int16
int System.Int32
long System.Int64
float System.Single
double System.Double
decimal System.Decimal
object System.Object
string System.String

즉,

int

도 사실은

System.Int32

이다.  

그럼 왜 둘 다 만들었을까?

이유는 크게 두 가지이다.

1. 코드 작성이 편하다.

매번

System.Int32
System.Boolean
System.String

을 작성하는 것은 불편하다.

그래서 C#은

int
bool
string

같은 짧은 키워드를 제공한다.   2. C/C++ 개발자가 적응하기 쉽다.

C#은 C 계열 언어의 문법을 많이 계승했다.

따라서

int
float
bool

같은 익숙한 키워드를 유지하는 것이 학습 비용을 줄여준다.  

언제 string을 사용하는 것이 좋을까?

Microsoft의 공식 코딩 스타일에서도

C# 키워드를 사용하는 것을 권장한다.

즉, 다음처럼 작성하는 것이 일반적이다.

string name = "Alice";
int age = 20;
bool isAdult = true;

 

그럼 String은 언제 사용할까?

실제로는 거의 사용하지 않는다. 다만, 정적 메서드를 사용할 때는 종종 볼 수 있다.

예를 들어

String.IsNullOrEmpty(text);

또는

String.Compare(a, b);

물론

System.String.IsNullOrEmpty(text);

도 같은 코드이다.

최근에는

string.IsNullOrEmpty(text);

처럼 사용하는 경우도 많다.

왜냐하면 string도 결국 System.String으로 해석되기 때문이다.  

string은 값 타입일까?

많은 초보 개발자가 헷갈리는 부분이다.

string

은 키워드이기 때문에 마치 기본 타입(Value Type)처럼 보인다.

하지만 그렇지 않다.

string

은 참조 타입(Reference Type) 이다.

즉,

string text = "Hello";

는 실제로 Heap에 생성된 System.String 객체를 참조한다.

이에 대해서는 다음 글에서 자세히 다룬다.  

string과 String 중 무엇을 사용할까?

대부분의 경우에는

string

을 사용하는 것이 좋다.

그 이유는

  • Microsoft 공식 스타일 가이드
  • Visual Studio 기본 설정
  • 대부분의 오픈소스 프로젝트

모두 string을 기본으로 사용하기 때문이다.

즉, 일관성을 위해서라도 string을 사용하는 것이 좋다.  

마무리

string과 String은 서로 다른 타입이 아니다. string은 C# 언어가 제공하는 키워드이고, String은 실제 .NET에서 제공하는 System.String 클래스이다.

컴파일러는 string을 만나면 자동으로 System.String으로 변환하기 때문에 성능이나 실행 결과의 차이는 전혀 없다.

다음 글에서는 C# 문자열의 가장 중요한 특징 중 하나인 왜 String은 Immutable(불변 객체)로 설계되었는지 알아보겠다.  

핵심 정리

  • string은 C# 키워드이다.
  • String은 System.String 클래스이다.
  • string은 System.String의 별칭(alias)이다.
  • 컴파일 후에는 두 코드가 완전히 동일하다.
  • 성능 차이는 전혀 없다.
  • 일반적으로는 string 사용을 권장한다.
  • string은 기본 타입처럼 보이지만 실제로는 참조 타입이다.