Section 19.3: DateTime.AddHours(Double) 메소드

double[] hours = { .08333, .16667, .25, .33333, .5, .66667, 1, 2, 29, 30, 31, 90, 365 }; DateTime dateValue = new DateTime(2009, 3, 1, 12, 0, 0); foreach(double hour in hours) Console.WriteLine("{0} + {1} hour(s) = {2}", dateValue, hour, dateValue.AddHours(hour));

출력 결과 :

3/1/2009 12:00:00 PM + 0.08333 hour(s) = 3/1/2009 12:04:59 PM 3/1/2009 12:00:00 PM + 0.16667 hour(s) = 3/1/2009 12:10:00 PM 3/1/2009 12:00:00 PM + 0.25 hour(s) = 3/1/2009 12:15:00 PM 3/1/2009 12:00:00 PM + 0.33333 hour(s) = 3/1/2009 12:19:59 PM 3/1/2009 12:00:00 PM + 0.5 hour(s) = 3/1/2009 12:30:00 PM 3/1/2009 12:00:00 PM + 0.66667 hour(s) = 3/1/2009 12:40:00 PM 3/1/2009 12:00:00 PM + 1 hour(s) = 3/1/2009 1:00:00 PM 3/1/2009 12:00:00 PM + 2 hour(s) = 3/1/2009 2:00:00 PM 3/1/2009 12:00:00 PM + 29 hour(s) = 3/2/2009 5:00:00 PM 3/1/2009 12:00:00 PM + 30 hour(s) = 3/2/2009 6:00:00 PM 3/1/2009 12:00:00 PM + 31 hour(s) = 3/2/2009 7:00:00 PM 3/1/2009 12:00:00 PM + 90 hour(s) = 3/5/2009 6:00:00 AM 3/1/2009 12:00:00 PM + 365 hour(s) = 3/16/2009 5:00:00 PM
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.2: DateTime.AddDays(Double) 메소드

DateTime 객체에 일 (days) 수를 더한다.

DateTime today = DateTime.Now; DateTime answer = today.AddDays(36); Console.WriteLine("Today: {0:dddd}", today); Console.WriteLine("36 days from today: {0:dddd}", answer);

음수의 값을 넘김으로써 일 (days) 수를 뺄 수도 있다:

DateTime today = DateTime.Now; DateTime answer = today.AddDays(-3); Console.WriteLine("Today: {0:dddd}", today); Console.WriteLine("-3 days from today: {0:dddd}", answer);
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 19.1: 날짜/시간 (DateTime) 서식 지정하기

표준 날짜/시간 서식 지정하기

DateTimeFormatInfo 에서는 간단한 날짜와 시간 정보 표시를 위한 서식 지정자들의 모음을 제공하고 있다. 각 서식 지정자들은 DateTimeFormatInfo 에서 정의하고 있는 특정 서식 패턴 (format pattern) 에 대응하게 되어 있다.

// 날짜/시간 정보 생성하기 DateTime dt = new DateTime(2016,08,01,18,50,23,230); var t = String.Format("{0:t}", dt); // "6:50 PM" 짧은 형식의 시간 정보 var d = String.Format("{0:d}", dt); // "8/1/2016" 짧은 형식의 날짜 정보 var T = String.Format("{0:T}", dt); // "6:50:23 PM" 긴 형식의 시간 정보 var D = String.Format("{0:D}", dt); // "Monday, August 1, 2016" 긴 형식의 날짜 정보 var f = String.Format("{0:f}", dt); // "Monday, August 1, 2016 6:50 PM" 긴 형식의 날짜 정보와 짧은 형식의 시간 정보 var F = String.Format("{0:F}", dt); // "Monday, August 1, 2016 6:50:23 PM" 긴 형식의 날짜 및 시간 정보 var g = String.Format("{0:g}", dt); // "8/1/2016 6:50 PM" 짧은 형식의 날짜 및 시간 정보 var G = String.Format("{0:G}", dt); // "8/1/2016 6:50:23 PM" 짧은 형식의 날짜 정보와 긴 형식의 시간 정보 var m = String.Format("{0:m}", dt); // "August 1" 월/일 정보 var y = String.Format("{0:y}", dt); // "August 2016" 년/월 정보 var r = String.Format("{0:r}", dt); // "SMon, 01 Aug 2016 18:50:23 GMT" RFC1123 규격의 날짜/시간 정보 var s = String.Format("{0:s}", dt); // "2016-08-01T18:50:23" 정렬가능한 날짜/시간 정보 var u = String.Format("{0:u}", dt); // "2016-08-01 18:50:23Z" 정렬 가능한 UTC 형식의 로컬 시간 정보

날짜/시간 서식 사용자 지정하기

아래와 같은 사용자 서식 지정자들이 제공된다:

  • y (년)
  • M (월)
  • d (일)
  • h (12 시간 기준 시)
  • H (24 시간 기준 시)
  • m (분)
  • s (초)
  • f (초에 대한 소수점 이하 자리)
  • F (초에 대한 소수점 이하 자리, 0으로 끝나는 숫자는 제외)
  • t (P.M / A.M)
  • z (표준 시간대)
var year = String.Format("{0:y yy yyy yyyy}", dt); // "16 16 2016 2016" 년 var month = String.Format("{0:M MM MMM MMMM}", dt); // "8 08 Aug August" 월 var day = String.Format("{0:d dd ddd dddd}", dt); // "1 01 Mon Monday" 일 var hour = String.Format("{0:h hh H HH}", dt); // "6 06 18 18" 시간 - 각각 12/24 기준 var minute = String.Format("{0:m mm}", dt); // "50 50" 분 var secound = String.Format("{0:s ss}", dt); // "23 23" 초 var fraction = String.Format("{0:f ff fff ffff}", dt); // "2 23 230 2300" 소수점 이하 자리 var fraction2 = String.Format("{0:F FF FFF FFFF}", dt); // "2 23 23 23" 뒤따르는 0 제거한 버전 var period = String.Format("{0:t tt}", dt); // "P PM" A.M. 혹은 P.M. var zone = String.Format("{0:z zz zzz}", dt); // "+0 +00 +00:00" 표준 시간대

또한 날짜 구분자 표시를 위한 서식 지정자 / (slash) 와 시간 구분자 표시를 위한 서식 지정자 : (colon) 역시 사용 가능하다.

역주: 시간 구분자 표시를 위한 서식 지정자 사용 예는 아래 코드를 참고하세요.

DateTime value = new DateTime(2013, 9, 8, 14, 30, 0); CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); DateTimeFormatInfo dtfi = culture.DateTimeFormat; dtfi.TimeSeparator = "."; Console.WriteLine("{0}", value.ToString("HH:mm", dtfi)); // 출력 결과 : 14.30

코드 예제 확인하기

더욱 상세한 정보는 MSDN 을 확인한다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 18.2: 정규 표현식 패턴 다중 매칭

using System.Text.RegularExpressions; List < string > found = new List < string > (); string pattern = ":(.*?):"; string lookup = "--:text in here:--:another one:-:third one:---!123:fourth:"; // Regex 객체를 생성하면서 매칭에 사용할 정규 표현식 패턴을 파라미터로 전달한다 Regex rgxLookup = new Regex(pattern, RegexOptions.Singleline, TimeSpan.FromSeconds(1)); MatchCollection mLookup = rgxLookup.Matches(lookup); foreach(Match match in mLookup) { found.Add(match.Groups[1].Value); }

출력 결과:

text in here another one third one fourth

위 출력 결과는 아래 코드로 생성된 found 리스트에 대한 출력 결과와 동일하다.

found = new List<string>() { "text in here", "another one", "third one", "fourth" }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 18.1: 정규 표현식 패턴 단일 매칭

using System.Text.RegularExpressions; string pattern = ":(.*?):"; string lookup = "--:text in here:--"; // Regex 객체를 생성하면서 매칭에 사용할 정규 표현식 패턴을 파라미터로 전달한다 Regex rgxLookup = new Regex(pattern, RegexOptions.Singleline, TimeSpan.FromSeconds(1)); // Regex 객체로부터 매칭 결과를 받아온다 Match mLookup = rgxLookup.Match(lookup); // Groups[0] 에는 패턴에 매치된 전체 문자열이 들어있다. // 소괄호 (parentheses) 로 둘러싸여진 매칭 결과들은 배열 인덱스 1 이상의 값을 사용하여 접근할 수 있다. string found = mLookup.Groups[1].Value;

결과:

found = "text in here"
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Chapter 18: Regex 를 통한 파싱 (parsing)

역주: 아래 설명은 Regex(String, RegexOptions, TimeSpan) 생성자의 파라미터들에 대한 설명으로 보입니다.

이름 세부 사항
Pattern 검색에 사용될 문자열의 정규표현식 (Regular Expression) 패턴. 보다 상세한 사항은 msdn 을 참고한다.
RegexOptions [생략 가능한 옵션] 주로 사용되는 옵션으로는 SinglelineMultiline 이 있다. 이러한 옵션을 통해 Multiline 모드에서는 NewLine (\n) 을 포함하지 못하는 dot (.) 패턴 요소의 매칭 범위를 SingleLine 모드로의 변경을 통해 포함시키도록 하는 등 동작 특성을 변경할 수 있다. 기본 동작에 대한 상세한 사항은 msdn 을 참고한다.
Timeout [생략 가능한 옵션] 매칭을 위한 패턴이 점점 복잡해짐에 따라 검색에 소요되는 시간은 더욱 늘어날 수 있으므로, 네트워크 프로그래밍시에서와 유사하게 Timeout 값을 통해 수행 최대 시간을 지정할 수 있다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 17.2: StringBuilder 를 이용하여 많은 수의 데이터 항목으로부터 문자열을 생성하는 예제

public string GetCustomerNamesCsv() { List < CustomerData > customerDataRecords = GetCustomerData(); // 많은 수의 (예:10000개 이상의) 데이터 항목을 반환하는 경우를 가정해본다 StringBuilder customerNamesCsv = new StringBuilder(); foreach(CustomerData record in customerDataRecords) { customerNamesCsv .Append(record.LastName) .Append(',') .Append(record.FirstName) .Append(Environment.NewLine); } return customerNamesCsv.ToString(); }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 17.1: StringBuilder 의 간략한 소개와 사용이 필요한 경우에 대한 설명

StringBuilder 는 문자 (character) 들의 연속된 집합을 나타내며, 일반적인 string 객체와는 다르게 가변적인 특성을 갖는다. 종종 이미 생성되어 있는 string 객체를 수정 혹은 변경할 필요가 생길 수 있으나, 표준 string 객체는 가변성을 지원하지 않는다. 이것이 의미하는 바는, string 객체가 수정되어야 할 때마다 새로운 string 객체가 생성되고, 내용 문자열이 복사된 후 객체의 재할당 작업이 이루어진다는 것이다.

string myString = "Apples"; mystring += " are my favorite fruit";

위 예제에서, myString 은 최초에는 "Apples" 라는 값만을 가지고 있다. 그러나, " are my favorite fruit" 이라는 문자열을 이어 붙이려 할 때, string 클래스는 내부적으로 다음과 같은 작업을 처리해 주게 된다:

  • myString 과 덧붙이려는 문자열의 길이 합 만큼의 문자 배열을 새로 생성한다.
  • myString 의 모든 문자들을 새로운 배열의 시작 위치에 복사하고 이후 추가될 문자열을 배열의 뒷부분에 복사한다.
  • 새로운 string 객체를 메모리상에 생성하고 이 객체를 myString 변수에 재할당한다.

이어 붙이는 작업이 일회성에 그친다면, 이러한 작업은 비교적 사소한 부분일 수 있을 것이다. 그러나, 만약 반복문에서의 사용과 같이 문자열에의 추가 작업 횟수가 늘어날 경우 문제는 달라질 수 있다.

String myString = ""; for (int i = 0; i < 10000; i++) myString += " "; // 문자열에 10,000 개의 공백 문자를 추가한다

반복된 객체 생성과 문자열 복사로 인해, 위와 같은 예제는 프로그램에 심각한 성능 저하를 초래할 수 있을 것이다. 이러한 문제를 피하기 위하여, StringBuilder 사용을 고려해 볼 수 있다.

StringBuilder myStringBuilder = new StringBuilder(); for (int i = 0; i < 10000; i++) myStringBuilder.Append(' ');

동일한 반복문을 수행한 경우, 이와 같이 수정한 프로그램의 속도는 일반 string 을 이용했을 때보다 상당한 개선이 이루어질 것이다. StringBuilder 를 일반 string 으로 변환하고 싶은 경우에는, 간단히 StringBuilderToString() 메소드를 불러주기만 하면 된다.

물론, 이는 StringBuilder 가 가지고 있는 유일한 최적화 기능은 아니다. 더욱 최적화된 기능 수행을 위하여, 성능 향상을 가져올 수 있는 다른 속성들의 도움을 받을 수 있다.

StringBuilder sb = new StringBuilder(10000); // 저장소 최대치 (capacity) 를 10000 으로 초기화한다

사용하고자 하는 StringBuilder 의 내용물의 길이값이 얼마나 될 지 미리 알 수 있다면, 해당하는 크기를 미리 지정해 두어, 내부적으로 문자 배열의 크기를 필요시마다 재조정하는 작업을 방지할 수 있다.

sb.Append('k', 2000);

비록 StringBuilder 를 사용하는 것만으로도 string 사용시보다 빠른 속도로 문자열 이어붙이는 작업을 수행할 수 있지만, 위와 같이 하나의 문자를 여러번 붙여 넣어야 하는 경우 더욱 빠르게 작업을 수행할 수 있는 메소드도 제공한다.

원하는 문자열을 생성하는 작업을 모두 마친 이후에는, StringBuilderToString() 메소드를 이용하여 이를 기본 string 으로 변환시킬 수 있다. StringBuilder 클래스가 string 으로부터 상속을 받고 있지 않기 때문에, 이러한 작업이 필요한 경우가 종종 발생할 것이다.

StringBuilder 를 사용하여 string 객체를 생성해내는 예제가 아래에 소개되어 있다:

string RepeatCharacterTimes(char character, int times) { StringBuilder builder = new StringBuilder(""); for (int counter = 0; counter < times; counter++) { // 한개의 문자를 StringBuilder 에 추가한다. builder.Append(character); } // 최종 결과를 string 객체로 만들어 반환한다. return builder.ToString(); }

결론적으로, StringBuilder 는 문자열에 많은 수정이 이루어져야 하는 경우, 성능 저하가 우려될 때 string 을 대신하여 사용하는 것이 바람직하다고 할 수 있다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts