[문과 코린이의 IT 기록장] C# - 데이터 보관하기 3 : 문자열 다루기
(문자열 안에서 찾기, 문자열 변형하기, 문자열 분할하기, 문자열 서식 맞추기)
[ 문자열 다루기 ]
- 코딩할 때, 숫자만큼 많이 다루는 데이터 형식이 바로 문자열이다.
- string 형식은 그저 문자열을 담는 역할만 할 뿐 아니라, 문자열을 가공하기 위한 다양한 기능도 제공하고 있다.
1. 문자열 안에서 찾기
- 대부분의 문자열 가공 메소드는, 문자열 내에서 '어느 부분'을 가공할 것인지를 입력받는다.
- string 형식은 바로, 이 부분을 찾아주는 기능을 다양하게 제공한다.
[ stirng 형식이 제공하는 탐색 메소드의 종류와 역할 ]
메소드 | 설명 |
IndexOf() | 현재 문자열 내에서 찾고자 하는 지정된 문자 또는 문자열의 위치를 찾는다. |
LastIndexOf() | 현재 문자열 내에서 찾고자 하는 지정된 문자 또는 문자열의 위치를 뒤에서부터 찾는다. |
StartsWith() | 현재 문자열이 지정된 문자열로 시작하는지를 평가한다. |
EndsWith() | 현재 문자열이 지정된 문자열로 끝나는지를 평가한다. |
Contains() | 현재 문자열이 지정된 문자열을 포함하는지를 평가한다. |
Replace() | 현재 문자열에서 지정된 문자열이 다른 지정된 문자열로 모두 바뀐 새 문자열을 반환한다. |
ex )
2. 문자열 변형하기
- string 형식은 문자열 중간에 또 다른 문자열을 삽입하거나 , 특정 부분을 삭제하는 등 작업을 수행하는 메소드도 제공한다. 더불어, 대문자/소문자로의 변환 메소드, 문자열 앞/뒤 공백 제거 메소드도 제공한다.
메소드 | 설명 |
ToLower() | 현재 문자열의 모든 대문자를 소문자로 바꾼 새 문자열을 반환한다. |
ToUpper() | 현재 문자열의 모든 소문자를 대문자로 바꾼 새 문자열을 반환한다. |
Insert() | 현재 문자열의 지정된 위치에 지정된 문자열이 삽입된 새 문자열을 반환한다. |
Remove() | 현재 문자열의 지정된 위치로부터 지정된 수만큼의 문자가 삭제된 새 문자열을 반환한다. |
Trim() | 현재 문자열의 앞/뒤에 있는 공백을 삭제한 새 문자열을 반환한다. |
TrimStart() | 현재 문자열의 앞에 있는 공백을 삭제한 새 문자열을 반환한다. |
TrimEnd() | 현재 문자열의 뒤에 있는 공백을 삭제한 새 문자열을 반환한다. |
* 공백 제거 메소드는 생각보다 자주 사용됨.
ex )
3. 문자열 분할하기
"MSFT, GOOG, AMZN, AAPL, RHT"
- string 형식은 위와 같이 콤마(,)로 구분된 문자열에서, 콤마를 제외한 내용을 Split() 메소드로 단번에 배열로 만들 수 있다.
- 그러나 항상 이렇게 일정한 간격으로 콤마(,)를 사용해 구분되어 있지는 않다. 따라서 그럴 때는 1. 문자열 탐색을 이용해서 잘라낼 부분을 자른 뒤, SubString() 메소드를 이용해 하나씩 잘라내면 된다.
메소드 | 설명 |
Split() | 지정된 문자를 기준으로 현재 문자열을 분리한 다음, 분리한 문자열의 배열을 반환한다. |
SubString() | 현재 문자열의 지정된 위치로부터 지정된 수만큼의, 문자로 이루어진 새 문자열을 반환한다. |
ex )
4. 문자열 서식 맞추기
- 문자열 서식 : 문자열이 일정한 틀과 모양을 갖추는 것
ex )
제품명 : 망고주스 가격 : 1,500원 용량 : 250ml 유통기한 : 2021-10-9 12:11:11 |
제품명 : 자몽주스 가격 : 1,700원 용량 : 500ml 유통기한 : 2021-9-29 10:32:14 |
- C#에서는 문자열 서식화에 사용할 수 있는 간편한 방법 두 가지를 제공한다.
1) string 형식의, Format() 메소드
2) 문자열 보간
* 두 방법 모두 문자열 틀을 두고, 그 틀을 이용해서 서식화된 새로운 문자열을 만들어낸다는 공통점이 있다.
1) Format() 메소드
- Console.WriteLine() 메소드는 내부적으로, string.Format() 메소드를 사용한다.
Console.WriteLine("제목 : {0}", "이것이 C#이다"); * Console.WriteLine( 문자열 틀, 문자열 틀 내부에 넣을 데이터 1, 데이터 2, ... ); |
- string.Format() 메소드의 사용 방법도 이와 동일하다.
- 서식 항목에 추가 옵션을 입력함으로써, 더욱 다양한 서식화를 수행할 수 있다.
* 서식 항목(Format Item) : 문자열 틀에 입력하는 {0}, {1}, ...
cf ) 서식 항목의 옵션 { 서식 항목의 첨자, 왼쪽/오른쪽 맞춤, 변환 서식 지정 문자열 } ex ) Console.WirteLine("Total : {0, -7 : D}", 123); // 첨자 : 0, 맞춤 : -7, 서식 문자열 : D |
(1) 왼쪽/오른쪽 맞춤
- 서식항목의 맞춤 옵션을 지정하면, 해당 서식 항목이 차지할 공간의 크기를 선택할 수 있고, 그 공간 안에서 왼쪽 또는 오른쪽에 데이터를 할당할지를 결정할 수 있다.
ex 1 )
string result = string.Format("{0,-10}DEF","ABC"); // result : "ABC DEF" |
- DEF 앞쪽에 문자 10개가 들어갈 수 있는 공간을 만들어 놓고, 공간의 앞(왼쪽)부터 "ABC"를 채워 넣어야 한다.
ex 2 )
string result = string.Format("{0,10}DEF","ABC"); // result : " ABCDEF" |
- DEF 앞쪽에 문자 10개가 들어갈 수 있는 공간을 만들어 놓고, 공간의 뒤(오른쪽)부터 "ABC"를 채워넣는다.
ex 3 )
- 문자열 서식을 왼쪽/오른쪽으로 맞추는 기능은, 프로그램이 여러 개의 항목을 가지런이 출력할 필요가 있을 때 특히 유용하다.
(2) 숫자 서식화
- 숫자도 표현하는 방식이 매우 다양하다. ex) 십진수, 16진수, 8진수, 지수 표현 등..
- stirng.Format() 메소드는 이렇듯 다양한 형태로 수를 서식화하는 기능을 지원한다.
{ 서식 항목의 첨자, 왼쪽/오른쪽 맞춤 : 서식 문자열 } |
[ 숫자 서식 지정자 ]
서식 지정자 |
대상 서식 | 설명 |
D | 10진수 | - 입력된 수를 10진수로 서식화한다. ex ) WriteLine("{0:D}", 255); // 255 WriteLine("{0:D}", 0xFF); // 255 |
X | 16진수 | - 입력된 수를 16진수로 서식화한다. ex ) WriteLine("{0:X}", 255); // 0xFF WriteLine("{0:X}", 0xFF); // 0xFF |
N | 콤마(,)로 묶어 표현한 수 |
- 입력된 수를 콤마로 구분하여 출력한다. ex ) WriteLine("{0,N}", 123456789); // 123,456,789.00 |
F | 고정소수점 | - 입력된 수를 고정소수점 형식으로 서식화한다. ex ) WriteLine("고성소수점 : {0,F}", 123.45); // 123.45 |
E | 지수 | - 입력된 수를 지수 표기로 서식화한다. ex ) WriteLine("공학 : {0,E}", 123.456789); // 1.2345678E+002 |
- 서식 문자열은 앞의 표에서 언급한 서식 지정자와 함께 "자리수 지정자"를 사용할 수 있다.
ex) Axx : A는 서식 지정자, xx는 자리수 지정자 (0~99까지 가능)
ex )
(3) 날짜 서식화
- 날짜와 시간을 표현하기 위해서는, DateTime 클래스가 필요하다.
DateTime dt = new DateTime(2018, 11, 3, 23, 18, 22); // 2018년 11월 3일 23시 18분 22초 WriteLine("{0}", dt); // 국가 및 지역설정에 따라 다른 결과 출력 |
[ 날짜 및 서식화 서식 지정자 ]
서식 지정자 |
대상 서식 | 설명 |
y | 연도 | - yy : 두 자릿수 연도(2018-11-03 23:18:22 ->18) - yyyy : 네 자릿수 연도 (2018-11-03 23:18:22 -> 2018) |
M | 월 | - M : 한 자릿수 월 (2018-01-08 21:03:07 -> 1) - MM : 두 자릿수 월 (2018-01-08 21:03:07 -> 01) |
d | 일 | - d : 한 자릿수 일 (2018-01-08 21:03:07 ->8) - dd : 두 자릿수 일 (2018-01-08 21:03:07 ->08) |
h | 시(1~12) | - h : 한 자릿수 시 (2018-01-08 21:03:07 -> 9) - hh : 두 자릿수 시 (2018-01-08 21:03:07 -> 09) |
H | 시(1~23) | - H : 한 자릿수 시 (2018-01-08 21:03:07 -> 21) - HH : 두 자릿수 시 (2018-01-08 21:03:07 ->21) |
m | 분 | - m : 한 자릿수 분 (2018-01-08 21:03:07 -> 3) - mm : 두 자릿수 분 (2018-01-08 21:03:07 -> 03) |
s | 초 | - s : 한 자릿수 초 (2018-01-08 21:03:07 -> 7) - ss : 두 자릿수 초 (2018-01-08 21:03:07 ->07) |
tt | 오전/오후 | - tt : 오전 / 오후 (2018-01-08 11:03:07 -> 오전, 2018-01-08 21:03:07 -> 오후) |
ddd | 요일 | - ddd : 약식 요일 (2018-01-08 21:03:07 -> 토) - dddd : 전체 요일 (2018-01-08 21:03:07 ->토요일) |
ex 1 )
DateTime dt = new DateTime{2018, 11, 3, 23, 18, 22}; // 12시간 형식 : 2018-11-03 오후 11:18:22 (토) WriteLine("12시간 형식 : {0:yyyy-MM-dd tt hh:mm:ss (ddd)}", dt); // 24시간 형식 : 2018-11-03 23:18:22 (토요일) WriteLine("24시간 형식 : {0:yyyy-MM-dd HH:mm:ss (dddd)}", dt); |
- CultureInfo 클래스의 도움을 받으면, 프로그래머가 직접 해당 문자열을 원하는 문화권 정보로 바꾸어준다.
- DateTime.ToString()메소드에 서식 문자열과 함께 이 클래스의 인스턴스를 입력하면, 해당 문화권에 맞는 요일 이름을 얻을 수 있다.
ex 2 )
CultureInfo ciKo = new CultureInfo("ko-KR"); // 2018-11-03 오후 11:18:22(토) WriteLine(dt.ToString("yyyy-MM-dd tt hh:mm:ss (ddd)", ciKo)); CultureInfo ciEn = new CultureInfo("en-US"); // 2018-11-03 PM 11:18:22 (Sat) WriteLine(dt.ToString("yyyy-MM-dd tt hh:mm:ss (ddd)", ciEn)); |
ex 3 )
2) 문자열 보간
- Format()메소드와 더불어, 서식화된 문자열을 편리하게 다룰 수 있는 또 다른 방법으로는 문자열 보간이 있다.
- 이 기능은 C# 6.0에서 새로 도입된 기능으로, 한결 더 편리하게 문자열의 양식을 맞출 수 있도록 도와준다.
* 보간 : 비거나 누락된 부분을 채운다.
- 문자열 보간이, string.Format()메소드와 다른 점
a. 문자열 틀 앞에 $기호를 붙인다는 것
b. 서식 항목에 첨자 대신 식이 들어간다.
* 이 식에는, 변수나 객체의 이름을 그대로 넣어 사용할 수도 있고 상수를 입력해 쓸 수도 있으며, 조건에 따라 다른 값을 출력하는 코드가 들어갈 수도 있다.
[ 문자열 틀의 구조 ]
$ "텍스트{<보간식>[,길이] [:서식]} 텍스트{...}..." - <보간식> : 보통 인스턴스의 이름을 지정하지만, 출력할 객체를 반환하는 식을 지정할 수도 있음 - 길이 : 길이 옵션, 서식 항목의 [맞춤]과 같음 - 서식 : 서식 항목의 [서식 문자열]과 같음 |
string.Format() | 문자열 보간 |
WriteLine("{0},{1},123,"최강한화"); | WriteLine($"{123},{"최강한화"}"); |
WriteLine("{0,-10.D5}",123); | WriteLine($"123,-10,:D5}"); |
int n = 123; string s = "최강한화"; WriteLine("{0},{1}",n,s); |
int n = 123; string s = "최강한화"; WriteLine($"{n},{s}"); |
int n = 123; WriteLine("{0}",n>100 ? "큼" : "작음" ,s); |
int n = 123'; WriteLine($"{(n>100 ? "큼" : "작음")}"); |
ex )
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |