본문 바로가기

문과 코린이의, [C#] 기록/C# 이론

[문과 코린이의 IT 기록장] C# - 데이터 보관하기 3 : 문자열 다루기 (문자열 안에서 찾기, 문자열 변형하기, 문자열 분할하기, 문자열 서식 맞추기)

반응형

 

[문과 코린이의 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 )

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형