#. 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);
}
}
결과는
class StringTest
{
static void Main(string[] args)
{
String str1 = "This is string.";
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));
}
}
'.net' 카테고리의 다른 글
Web Control - Calendar (3) | 2007.12.26 |
---|---|
Understanding session state modes + FAQ (1) | 2007.12.03 |
ConnectionStrings (1) | 2007.10.08 |
SQLHelper.cs (1) | 2007.10.05 |
새로고침(refresh) 막는법 (0) | 2007.10.05 |