.NET에는 숫자나 문자열, 배열등을 위한 다양한 Type이 정의되어 있으며 클래스나 구조체와 같은 사용자 정의 Type을 제외하고 대부분 프로그램에서 사용 가능한 수많은 Type을 포함하고 있습니다.
1. 숫자형
숫자는 가장 일반적으로 사용되는 데이터 타입중 하나로 아래와 같은 Type들이 존재합니다.
Namespace | Type | 목적 |
System | SByte, Int16, Int32, Int64 | 0을 포함한 양수, 음수등 일반적인 정수전체를 다룹니다. |
System | Byte, UInt16, UInt32, UInt64 | 0을 포함한 양수 전체를 다룹니다. |
System | Half, Single, Double | 부동 소수점과 같은 실수를 다룹니다. |
System | Decimal | 고정 소수점과 같은 실수를 다룹니다. |
System.Numerics | BigInteger, Complex, Quaternion | 임의 정수를 다룹니다. |
32-bit float과 64-bit double은 .NET Framework 1.0부터 존재한 Type인데 IEEE 754 명세는 또 다른 16-bit float에 관한 기준을 명시하고 있습니다. 머신러닝이나 기타 다른 알고리즘에서는 기존 float이나 double보다 더 작고 낮은 정확도의 Type이 오히려 더 도움이 될 수 있으므로 마이크로소프트는 System.Half를 .NET5부터 도입하게 되었습니다.
다만 2022년 6월 아직까지는 System.Half에 대한 별칭이 없는 상태이므로 System.Half를 그대로 사용해야 합니다.
● big integers
본래 .NET에서 저장 가능한 가장 큰 자연수의 Type은 18.5조 정도를 저장할 수 있는 unsigned long integer였습니다. 하지만 BigInteger를 사용하면 거의 무제한에 가까운 자릿수의 자연수를 다룰 수 있습니다.
using System;
using System.Numerics;
namespace myapp
{
class Program
{
static void Main(string[] args)
{
BigInteger bint = BigInteger.Parse("12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890");
Console.WriteLine(bint);
}
}
}
● complex & quaternion
complex는 복소수(complex number)를 나타내기 위한 것이며 quaternion은 복소수를 확장한 개념으로 실수들에 대한 4차원 연상 나눗셈 대수와 도메인을 형성합니다. complex는 과학이나 수학 관련 분야에 quaternion은 게임이나 비행 시뮬레이터와 같은 공간회전을 다루는 분야에 주로 사용됩니다.
사실 본인도 잘 모르는 부분이라 자세한 설명은 생략합니다.
2. 문자열(string) / 글(text)
숫자다음으로 가장 흔하게 사용되는 Data는 문자열이며 아래와 같은 Type을 사용할 수 있습니다.
Namespace | Type | 목적 |
System | Char | 하나의 문자를 다룹니다. |
System | String | 다수의 문자열을 다룹니다. |
System.Text | StringBuilder | 문자열을 다루며 기존 문자열을 변경하는 경우에 더 나은 성능을 제공합니다. |
System.Text.RegularExpressions | Regex | 문자열의 패턴매칭을 구현하는데 사용됩니다. |
● StringBuilder 사용
2개의 문자열을 결합하기 위해 아래서처럼 + 연산자를 사용하거나 아래에 소개할 Concat() 메서드를 사용할 수 있습니다.
string n1 = "abc";
string n2 = "def";
string n = string.Concat(n1, n2);
Console.WriteLine(n);
그러나 이와 같은 문자열 결합방법은 되도록 지향하는 것이 좋습니다. 왜냐하면 결합된 문자열을 메모리에 저장하기 위한 새로운 string형식이 만들어져야 하기 때문입니다.
물론 결합되는 문자열이 예제에서처럼 2개의 문자열을 결합하는 일시적인 동작이라면 큰 차이를 느낄 수 없겠지만 수많은 문자열 배열을 Loop구문을 통해 반복적으로 연결하는 등의 동작을 수행하게 된다면 Application의 전체적인 성능과 메모리 사용에 부정적인 영향을 끼칠 수 있습니다.
이러한 문제를 해결하기 위해 우리는 string대신 StringBuilder를 사용할 수 있습니다.
● 문자열길이
문자열의 길이는 String의 Length속성을 통해 알아낼 수 있습니다.
string s = "abcdef";
Console.WriteLine($"s의 길이는 {s.Length}");
//s의 길이는 6
● 문자 추출
string은 문자열 저장을 위해 내부적으로 char의 배열을 사용하며 또한 indexer를 구현하고 있으므로 배열 구문을 그대로 사용할 수 있습니다. 참고로 index의 위치는 0부터 시작하므로 3번째 문자를 추출할 때는 index를 2로 지정해야 합니다.
string s = "abcdef";
Console.WriteLine($"s의 첫번째 문자는 {s[0]}");
Console.WriteLine($"s의 세번째 문자는 {s[2]}");
// s의 첫번째 문자는 a
// s의 세번째 문자는 c
● 문자열 분리
문자열은 특정 문자, 예를 들어 콤마(,)와 같은 문자를 기준으로 문자열 분리가 가능합니다. 문자열 분리는 Split() 메서드를 사용하며 매개변수로 분리할 기준이 되는 문자를 지정합니다.
string name = "홍길동,홍길순,홍길남";
string[] names = name.Split(',');
foreach(string n in names)
{
Console.WriteLine($"분리된 이름 : {n}");
// 분리된 이름 : 홍길동
// 분리된 이름 : 홍길순
// 분리된 이름 : 홍길남
}
● 문자열 부분 추출
문자열은 내부에서 특정 위치와 길이를 지정하여 해당 문자열을 추출할 수도 있으며 이러한 기능은 Substring() 메서드를 통해 구현할 수 있습니다.
string name = "홍길동,홍길순,홍길남";
int startIndex = name.IndexOf(',');
string secondName = name.Substring(startIndex + 1, 3);
Console.WriteLine(secondName);
int startIndex2 = name.IndexOf(',', 6);
string lastName = name.Substring(startIndex2 + 1);
Console.WriteLine(lastName);
// 홍길순
// 홍길남
예제에서 사용된 IndexOf()는 문자열 안에서 특정 문자 혹은 문자열을 기준으로 시작하는 index값을 가져오도록 합니다. 첫 번째 IndexOf()에서는 콤마(,)를 지정하였으므로 문자열 안에서 가장 처음에 등장하는 ,의 위치를 index로서 반환하게 됩니다. 그리고 이 값을 통해 Substring() 메서드를 사용하여 중간 이름을 가져오도록 하였습니다. Substring() 매개변수에서 startIndex에서 +1 하는 이유는 문자열 안에서 Index는 0부터 시작하므로 이를 보정해 주기 위한 것이고 두 번째 매개변수는 해당 Index부터 가져올 문자열의 길이를 위한 것입니다. 예제는 3으로 지정하였으므로 정확히 '홍길순'이라는 이름을 가져오게 됩니다.
두번째 Substring은 문자열을 가져오는 시작 Index만 지정하고 문자열의 길이는 따로 지정하지 않았는데 이때는 해당 Index부터 문자열의 끝까지 전부를 가져오게 됩니다.
● 문자열의 처음과 끝 확인
문자열의 시작과 끝이 원하는 값인지를 확인하는 것은 StartWith() 메서드와 EndWith() 메서드로 가능하며 문자열 중간인 경우 Contain() 메서드를 통해 원하는 문자열의 포함 여부를 확인할 수 있습니다.
string name = "1홍길동";
bool isOne = name.StartsWith("1");
bool isExists = name.Contains("홍");
Console.WriteLine($"홍씨는 {(isOne ? "첫번째" : "그 외")} 순서이며 {(isExists ? "홍씨성" : "그외 성씨")}를 가졌습니다.");
//홍씨는 첫번째 순서이며 홍씨성를 가졌습니다.
● 문자열 관련 멤버
위와 내용과 함께 String에는 관련된 유용한 메서드 및 속성들이 다수 존재합니다.
Trim, TrimStart, TrimEnd | 대상 문자열의 처음과 끝에 공백이나 Tab, carriage return과 같은 이스케이프 시퀀스문자를 제거합니다. |
ToUpper, ToLower | 대상 문자열이 알파벳인 경우 해당 문자열을 대문자나 소문자로 변환합니다. |
Insert, Remove | 특정한 문자를 끼워넣거나 제거합니다. |
Replace | 대상문자열을 지정한 문자열로 바꿔줍니다. |
string.Empty | ""과 같은 공백문자를 나타냅니다. |
string.Concat | 2개 이상의 문자열이나 문자배열을 결합해 하나의 문자열을 생성합니다. |
string.Join | 기준이 되는 문자열을 통해 2개 이상의 문자열이나 문자배열을 결합합니다. |
string.IsNullOrEmpty | 특정 문자열 변수가 null이거나 공백상태인지를 판단합니다. |
string. IsNullOrWhitespace | 특정 문자열 변수가 null이거나 Tab, carriage return과 같은 Whitespace문자인지를 판단합니다. |
string.Format | 특정 문자열을 형식화 하여 표현하며 '문자열 보간'대신 사용할 수 있습니다. |
'string.'으로 시작하는 메서드는 모두 정적 메서드이므로 인스턴스가 아닌 Type안에서만 호출될 수 있습니다.
'.NET' 카테고리의 다른 글
[.NET] 닷넷 Type 사용하기 - 3. 정규식(regular expressions) (0) | 2022.06.26 |
---|---|
[.NET] 닷넷 Type 사용하기 - 2. 날짜와 시간 (0) | 2022.06.26 |
[.NET] 닷넷 - 5. .NET Framework에서 .NET으로의 전환 (0) | 2022.06.24 |
[.NET] 닷넷 - 4. Decompiling (0) | 2022.06.24 |
[.NET] 닷넷 - 3. 배포하기 (0) | 2022.06.24 |