C#에서의 문자열 (String)

#. String


현재 저는 현장에서 자바로 작업을 하고 있습니다. 자바소스작업을 하면서 API중 가장 많이 뒤져보는 항목이 아마 String이지 않나 싶습니다. 은근히 많이 쓰이면서 , 알아두면 소스가 깔끔해지는 메쏘드들이 많이 있지요. 아마 물론, C#에서도 그만큼이나 잘 사용되어 질 것입니다.


문자열을 처음 배우던 때가 잠시 생각나는군요. 문자열은 char타입의 배열로써 마지막에 \0을 입력함으로써 문자열의 마지막을 나타낸다. 라는 것이 기본이지요. 포인터 설명할때 연습시키기 딱 좋은 내용입니다만, 자바를 건너서 C#으로 넘어오면서 이러한 내용은 이제는 그다지 중요한 내용이 아닌듯 싶습니다. 이젠 문자열도 객체화되어서 encapsulation되어버렸지요. 문자열내 포인터에 이상을 주지 말고 잘 쓰자! 라고 한다면야 그러하지 않은 클래스가 어디 있겠습니까. 문자열 클래스를 구현하지 않는 이상, 어떤 내용의 메쏘드가 있고 몇가지 주의점을 주지하는 정도로 충분하지 않을까 생각합니다.


일단 오늘의 주제 String클래스의 구문에 대해서 살펴보겠습니다.


구문


public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable


구현한 인터페이스를 살펴보자면...


IComparable : 자바의 Comparable과 동일합니다. 크기비교를 위한 compareTo메쏘드를 갖고 있습니다.

혹시 앞의 배열의 내용에서 sort라는 메쏘드가 있던 사실을 기억하십니까.

sort하기 위해서는 당연히 크기 비교가 필요합니다. 프리미티브 타입이라면 간단하게 숫자의 크기비교로 가능하겠습니다만, 오브젝트 타입이라면 비교를 위한 바로 이 IComparable클래스를 상속받아서 compareTo메쏘드를 구현하여야만 합니다. String이라면야 이미 구현되어 있기 때문에 수고로이 구현할 필요가 없지만 사용자가 직접 만들었고 크기 비교가 필요하다! 라면 바로 이 인터페이스를 상속받아야만 합니다.


ICloneable : 자바의 Clonable과 동일합니다. 객체의 복제를 위함입니다.


IConvertible : 맨처음 C#의 개념에 대해 설명할때 CLS(Common Language Specification)이라는 단어를 기억하시는지요. 서로 다른 언어간 상호이용을 가능하게 하기위해 규약한 최소한의 문법이지요. C#내에 사용되어지는 타입은 C#만의 독특한 타입으로써 다른 언어에서는 이해하지 못할 내용이 있습니다. 그러한 타입을 CLS규격에 맞추어주는 인터페이스이지요. MSDN의 설명을 빌리자면 [구현하는 참조의 값 또는 값 형식을 같은 값의 공용 언어 런타임 형식으로 변환하는 메서드를 정의합니다.] 라는군요.


IEnumerable : 단어를 가지고 일반적인 내용을 생각하여 본다면 아마 enumeration을 위한 인터페이스이지 않나 싶습니다. 이렇게 추측만 하는 이유는 제가 MSDN에서 이 인터페이스를 못찾아서입니다. -_-; 아직 제가 MSDN보는게 익숙하지 않아서 그런가... 합니다만.. 나중에 다시 찾아보겠습니다. 클래스 이름상, Enumeration이 맞을듯 합니다만;;; 아 enumeration이란 역시 아시는대로 비순차적 데이터를 순차적으로 정리하는 작업이라고 할수 있겠습니다.


생성자


unsafe public String(char* value)

public Stiring(char[] value)

unsafe public String(sbyte* value)

public String(char c, int count)

unsafe public String(char c, int count)

unsafe public String(char*, int, int);

public String(char[], int, int);

unsafe public String(sbyte*, int, int);

unsafe public String(sbyte*, int, int, Encoding);


생성자에 대해서 열심히 설명해보아야 기억하기만 어렵다고 생각합니다.

필요할때 http://msdn.microsoft.com/library/KOR/cpref/html/frlrfSystemStringClassctorTopic.asp


여기로 가서 찾아봅시다.

자바할땐 자바doc, ms쪽이라면 MSDN을 펴놓고 해야하는건 당연한 일일테니까요.


문자열은 케릭터 배열이라는 개념이 많이 남아 있는듯한 생성자의 모습입니다. 다들 배열포인터를 인자로 받지요. 또한 자바와는 다르게 String자체를 인자로 하는 생성자는 없습니다.

특이하게 인코딩정보를 인자로 갖는 생성자도 있군요.

다들 필요에 따라서 사용되어질 경우도 있겠지만, 일반적인 경우 생성하기 까다롭게들 생긴 생성자이지요.

허나 역시 자바와 같이

String str = "This is String";

의 생성도 가능합니다.



필드


public static readonly string Empty


빈문자를 나타내는 상수입니다. 문자가 null일 경우 이 문자가 반환되어집니다.


아 갑자기 생각난 것입니다만 String클래스 선언이 string, 즉 가장 앞의 소문자일수도 있습니다. 이것은 C#의 기본 클래스들이 aliasing되어 있어서 string으로 사용하여도 String이 사용되어집니다.



속성 & 인덱서


public char this[int index] {get;}

문자열에서 지정된 문자의 위치에 있는 문자를 반환합니다.


public int Length{getl;}

현재문자열의 문자갯수를 반환합니다.



잠깐 여기에서 지금까지의 내용을 실습하고 넘어가보겠습니다.


using System;
class StringTest
{
    static void Main(string[] args)
    {
        String str1 = "This is first String.";
        char[] chars = "This is second String.".ToCharArray();
        String str2 = new string(chars);
       
        Console.WriteLine(str1[10]);
        Console.WriteLine(str2+" Length : "+ str2.Length);
    }
}


결과는

 
여기에서 왠일로 갑자기 실습을 하는가 제 자신도 의아합니다만, 실습은 알게 모르게 다 도움이 된다하니 좋게 생각하고 넘어갑니다.
 
 
메소드
 
역시 문자열에 관한 클래스 답게 많은 수의 메소드가 있습니다.
전부를 소개하는 것은 무리이려니와 MSDN! 이라는 막강 설명지침서가 있으므로
크게 카테고리별로 소개하는 정도로 하겠습니다.
 
static method
 
Compare method
상당히 여러가지 형태로 오버로딩 되어 있습니다.
이름에서 알수 있듯이 두 문자열을 비교하는 클래스입니다. 따라서 인자는 당연히 두개의 문자열이 들어오는 것을 기본으로 합니다. 그 외 어디부터 비교 하느냐, 어떠한 문자는 무시하느냐 는 인자가 붙고 안붙고의 차이입니다.
 
만약 앞의 문자열이 뒤의 문자열보다 작다면 음수, 같으면 0, 크면 양수가 반환됩니다. 문자열이 무효한 경우에는 ArgumentOutObRangeException이 발생합니다.
 
Concat method
역시 많이 보아왔던 메쏘드. 이어붙이기 메쏘드이지요. "This is"와 " String"을 이어붙여 "This is String"을 만드는 것입니다. 역시 두개의 문자열은 입력으로 필요합니다. 여러가지로 오버로딩 되어 있군요. 그래봐야 비슷비슷합니다만..
 
Equals
자바에서 많이 보아왔던 메쏘드. 역시나 동일한 역활을 합니다. 인자로는 두개의 문자열이 필요하지요. (현재는 스태틱 메소드들이라는 것을 기억해주시기 바랍니다.)
 
public static string Intern(string str)
intern pool 내에 지정 문자열에 대한 주소값을 가져옵니다.
이건 좀 자바랑 다르군요. 자바의 경우 문자열은 기본적으로 풀을 사용합니다만, C#의 경우는 다르군요. 사용자가 직접 관리합니다.
 
join
인자의 문자열 사이에 지정된 분리자를 위치시켜 새로운 문자열을 만듭니다. 예를 들어 "str1", "str2"의 문자열과 ", "의 분리자를 넣으면 "str1, str2"의 문자열을 만드는 것입니다.
이건 가끔 써먹을 일이 있을듯 하군요.
 
instance method
 
Clone
이 문자열 객체를 그대로 복사한 새로운 객체를 반환합니다.
 
IndexOf
특정 문자의 첫번째 위치를 반환합니다.  예를 들어 "This is string"의 s의 해당 메소드 리턴값은 3이지요
 
LastIndexOf
거꾸로 뒤로부터의 위치값을 반환합니다. "This is string"의 s의 해당 메소드 리턴값은 8입니다.
 
Insert
문자열을 삽입합니다. "This is string"의 8의 인덱스에 "first "를 넣으면 "This is first string"입니다.
 
Remove
지정위치로부터 지정한 갯수만큼의 문자를 삭제합니다.
"This is string"의 8부터 3개라면 "This is str"입니다.
 
Replace
지정 문자를 새로운 문자로 치환시킵니다.
"This is string"에서 i 를 o로 치환하면 "Thos os strong"이 되겠지요.
 
Split
문자를 지정된 분리자를 이용하여 분리합니다.
"This is string"를 i를 분리자로 분리하면 "Th", "s ", "s str", "ng"가 나옵니다.
 
SubString
지정한 구간의 문자열을 분리해냅니다.
"This is string"에서 3부터 6까지 분리하면 "s is s"가 됩니다.
 
ToCharArray
문자열을 char의 배열타입으로 반환합니다. 마지막에 널문자는 없습니다.
 
 
그외 많은 메소드들이 있습니다만, 실제 실무에서 사용한 적이 없는 관계로 뭐라 설명드릴수가 없군요.
 
끝으로 대강 스트링 메소드를 한번 테스트 해볼낼까 합니다.
 
using System;
class StringTest
{
    static void Main(string[] args)
    {
        String str1 = "This is string.";
        Console.WriteLine("Clone :"+ str1.Clone());
        Console.WriteLine("IndexOf :" + str1.IndexOf('s'));
        Console.WriteLine("LastIndexOf :" + str1.LastIndexOf('s'));
        Console.WriteLine("Insert :" + str1.Insert(8, "first "));
        Console.WriteLine("Replace :" + str1.Replace('i', 'o'));
        Console.WriteLine("Split :" + string.Join(", ", str1.Split('i')));
        Console.WriteLine("SubString :" + str1.Substring(3, 6));
    }
}
아. String메소드들은 한결같이 내부의 변수에 작업하는 것이 아닌 새로운 변수로 작업, 반환하는 형식이므로 원본 스트링이 훼손 되는 일은 없습니다.
 
 
잘 맞는군요!! 하하 (사실 몇군데 삑싸리가 있어 수정한 것입니다. ;;)
 
 
아무리 봐도 이러한 글은 MSDN이나 DOC만큼이나 간결하고 깔끔하게 잘 정리된 글이 없다고 생각합니다.
이 String클래스는 아마도 몇번이나 제가 뒤져보게 될 항목이라고 생각합니다. 이것들을 전부 외우면 좋겠지만 제 생각으로는 대강 이런 것들이 있더라. 라는 것만 기억해두고 나중이 필요할때 아 그런게 있었지 하면서 MSDN을 찾아보는 것이 최선이라고 생각합니다.
 
끝으로 MSDN의 String을 링크하여두고 마치도록 하겠습니다.
신고

'☆Develpoer > └ .net' 카테고리의 다른 글

Web Control - Calendar  (3) 2007.12.26
Understanding session state modes + FAQ  (1) 2007.12.03
C#에서의 문자열 (String)  (0) 2007.10.11
ConnectionStrings  (1) 2007.10.08
SQLHelper.cs  (1) 2007.10.05
새로고침(refresh) 막는법  (0) 2007.10.05