달력

8

« 2025/8 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2016. 7. 9. 17:43

StringBuilder 클래스 프로그래밍/C#2016. 7. 9. 17:43

.NET Framework에서 StringBuilder 클래스

https://msdn.microsoft.com/ko-kr/library/2839d5h5(v=vs.110).aspx



1. String 개체는 변경할 수 없습니다(immutable).

2. System.String 클래스에서 메소드의 하나를 사용할 때마다 메모리에서 새 문자열 개체를 만들어지므로, 해당 새 개체에 대한 공간이 새로 할당됩니다.

3. 문자열을 반복적으로 수정해야 하는 경우, 새 문자열 개체를 만드는데 필요한 오버헤드가 증가하게 됩니다(costly).

4. System.Text.StringBuilder 클래스는 새 개체를 만들지 않고 문자열을 수정하고 싶을 때 사용될 수 있습니다.

5. 예를 들어 StringBuilder 클래스를 사용하면 루프에서 많은 문자열을 연결할 때 성능이 향상될 수 있습니다.


<System.Type 네임스페이스 가져오기>

1. StringBuilder 클래스는 System.Text 네임스페이스에 있습니다.

2. 코드에서 정규화된 형식 이름(a fully qualified type name)을 제공할 필요가 없도록 하려면 System.Text 네임스페이스를 가져올 수 있습니다.

using System;
using System.Text;

<StringBuilder 개체 인스턴스화>

1. 다음 예제와 같이 오버로드된 생성자 메서드 중 하나로 변수를 초기화하여 StringBuilder 클래스의 새 인스턴스를 만들 수 있습니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");

<용량 및 길이 설정>

1. StringBuilder는 캡슐화되는 문자열에서 문자 수를 확장할 수 있는 동적 개체(a dynamic object)이지만, 보관할 수 있는 최대 문자 수 값을 지정할 수 있습니다.

2. 이 값을 개체의 용량(the object of the capacity)이라고 하며, 현재 StringBuilder에 보관된 문자열의 길이와 혼동하지 마세요.

3. 예를 들어 길이가 5인 "Hello" 문자열을 사용하여 StringBuilder 클래스의 새 인스턴스를 만들고 개체의 최대 용량(a maximum capacity)을 25로 지정할 수 있습니다.

4. StringBuilder를 수정할 경우, 용량에 도달할 때까지 자체 크기(size for itself)를 재할당(reallocate) 할 수 없습니다.

5. 이 경우 새 공간이 자동으로 할당되고 용량은 두 배로 증가합니다.

6. 오버로드된 생성자 중 하나를 사용하여 StringBuilder 클래스의 용량을 지정할 수 있습니다.

7. 다음 예에서는 MyStringBuilder 개체를 최대 25개 공간으로 확장할 수 있도록 지정합니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!", 25);

8. 또한(Additionally) 읽기/쓰기 Capacity 속성을 사용하여 개체의 최대 길이를 설정할 수 있습니다.

9. 다음 예에서는 Capacity 속성을 사용하여 최대 개체 길이를 정의합니다.

MyStringBuilder.Capacity = 25;

10. EnsureCapacity 메서드를 사용하여 현재 StringBuilder의 용량을 확인할 수 있습니다.

11. 용량이 전달된 값보다 크면 변경되지 않고, 용량이 전달된 값보다 작으면 현재 용량이 전달된 값과 일치하도록 변경됩니다.

12. Length 속성을 보거나(view) 설정할(set) 수도 있습니다.

13. Length 속성을 Capacity 속성보다 큰 값으로 설정하면 Capacity 속성이 Length 속성과 동일한 값으로 자동으로 변경됩니다.

14. Length 속성을 현재 StringBuilder 내의 문자열 길이보다 작은 값으로 설정하면 문자열이 단축됩니다

<StringBuilder 문자열 수정>

1. 다음 표에서는 StringBuilder의 내용을 수정하는 데 사용할 수 있는 메서드를 보여 줍니다.

메서드 이름

기능

StringBuilder.Append

현재 StringBuilder의 끝에 정보를 추가합니다.

StringBuilder.AppendFormat

문자열에 전달된 서식 지정자를 서식 있는 텍스트로 바꿉니다.

StringBuilder.Insert

현재 StringBuilder의 지정된 인덱스에 문자열 또는 개체를 삽입합니다.

StringBuilder.Remove

현재 StringBuilder에서 지정된 수의 문자를 제거합니다.

StringBuilder.Replace

지정된 인덱스에서 지정된 문자를 바꿉니다.

<Append>

1. Append 메서드를 사용하여 현재 StringBuilder에 표시되는 문자열의 끝에 개체의 문자열 표현이나 텍스트를 추가(append)할 수 있습니다.

2. 다음 예에서는 StringBuilder를 "Hello World"로 초기화한 다음 개체의 끝에 일부 텍스트를 추가합니다.

3. 필요한 경우 공간이 자동 할당(allocate)됩니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Append(" What a beautiful day.");
Console.WriteLine(MyStringBuilder);
// The example displays the following output:
//       Hello World! What a beautiful day.


<AppendFormat>

1. String.AppendFormat 메서드는 StringBuilder 개체의 끝에 텍스트를 추가합니다.

2. 서식 지정할 개체의 IFormattable 구현을 호출하여 복합 서식 지정 기능을 지원합니다. 자세한 내용은 복합 형식 지정 참조

3. 따라서, 숫자, 날짜 및 시간, 열거형 값에 대한 표준 서식 문자열, 숫자, 날짜 및 시간 값에 대한 사용자 지정 서식 문자열, 사용자 지정 형식에 대해 정의된 서식 문자열을 허용합니다.

4. 서식 지정에 대한 자세한 내용은 .NET Framework의 형식 서식 지정을 참조하세요.

5. 이 메서드를 사용하여 변수의 서식을 사용자 지정하고 해당 갓을 StringBuilder에 추가할 수 있습니다.

6. 다음 예제에서는 AppendFormat 메서드를 사용하여 통화 값으로 서식 지정된 정수 값을 StringBuilder 개체의 끝에 배치합니다.

int MyInt = 25; 
StringBuilder MyStringBuilder = new StringBuilder("Your total is ");
MyStringBuilder.AppendFormat("{0:C} ", MyInt);
Console.WriteLine(MyStringBuilder);
// The example displays the following output:
//       Your total is $25.00      


<Insert>

1. Insert 메서드는 문자열 또는 객체를 현재 StringBuilder 객체의 지정된 위치에 추가합니다.

2. 다음 예제에서는 이 메서드를 사용하여 StringBuilder 객체의 여섯 번째 위치에 단어를 삽입합니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Insert(6,"Beautiful ");
Console.WriteLine(MyStringBuilder);
// The example displays the following output:
//       Hello Beautiful World!


<Remove>

1. Remove 메서드를 사용하여 지정된 0부터 시작하는 인덱스를 시작으로 현재 StringBuilder 객체에서 지정된 수의 문자를 제거할 수 있습니다.

2. 다음 예제에서는 Remove 메서드를 사용하여 StringBuilder 객체를 단축합니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Remove(5,7);
Console.WriteLine(MyStringBuilder);
// The example displays the following output:
//       Hello


<Replace>

1. Replace 메서드는 StringBuilder 객체 내의 문자를 다른 지정된 문자로 바꾸는 데 사용할 수 있습니다.

2. 다음 예제에서는 Replace 메서드를 사용하여 StringBuilder 객체에서 느낌표 문자(!)의 모든 인스턴스를 검색한 다음 물음표 문자(?)로 바꿉니다.

StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Replace('!', '?');
Console.WriteLine(MyStringBuilder);
// The example displays the following output:
//       Hello World?


<StringBuilder 개체를 문자열로 변환>

1. StringBuilder 객체에 표시되는 문자열을 String 매개 변수를 가진 메서드에 전달하거나 사용자 인터페이스에 표시하려면 StringBuilder 객체를 String 객체로 변환해야 합니다.

2. StringBuilder.ToString 메서드를 호출하여 이 변환을 수행합니다.

3. 다음 예제에서는 다양한 StringBuilder 메서드를 호출한 다음 StringBuilder.ToString() 메서드를 호출하여 문자열을 표시합니다.

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb = new StringBuilder();
      bool flag = true;
      string[] spellings = { "recieve", "receeve", "receive" };
      sb.AppendFormat("Which of the following spellings is {0}:", flag);
      sb.AppendLine();
      for (int ctr = 0; ctr <= spellings.GetUpperBound(0); ctr++) {
         sb.AppendFormat("   {0}. {1}", ctr, spellings[ctr]);
         sb.AppendLine();
      }
      sb.AppendLine();
      Console.WriteLine(sb.ToString());
   }
}
// The example displays the following output:
//       Which of the following spellings is True:
//          0. recieve
//          1. receeve
//          2. receive





'프로그래밍 > C#' 카테고리의 다른 글

LINQ 정리  (1) 2016.07.28
형 변환 예제  (0) 2016.07.10
대리자 Action, Func  (0) 2016.07.08
String.Format 메서드  (0) 2016.06.28
String 클래스  (0) 2016.06.22
:
Posted by 지훈2
2016. 7. 8. 18:42

대리자 Action, Func 프로그래밍/C#2016. 7. 8. 18:42

대리자 Action, Func

https://msdn.microsoft.com/ko-kr/library/system(v=vs.110).aspx





대리자설명
System_CAPS_pubdelegateAction

매개 변수가 없으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T>

매개 변수가 하나이고 값을 반환하지 않는 메서드를 캡슐화합니다.

이 유형에 대 한.NET Framework 소스 코드를 찾아보려면 참조는 Reference Source합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>

10 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>

11 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>

12 개의 매개 변수가 있으며 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>

13 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>

14 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>

15 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>

16 개이고 값을 반환 하지 않는 하는 메서드를 캡슐화 합니다.

System_CAPS_pubdelegateAction<T1, T2>

2개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3>

3개의 매개 변수가 있으며 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4>

4개의 매개 변수가 있으며 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5>

5개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6>

6개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7>

7개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8>

8개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAction<T1, T2, T3, T4, T5, T6, T7, T8, T9>

9개의 매개 변수가 있으며 값을 반환하지 않는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateAppDomainInitializer

응용 프로그램 도메인이 초기화 될 때 호출할 콜백 메서드를 나타냅니다.

System_CAPS_pubdelegateAssemblyLoadEventHandler

처리 하는 메서드를 나타내는 AssemblyLoad 의 이벤트는 AppDomain합니다.

System_CAPS_pubdelegateAsyncCallback

해당 비동기 작업을 완료할 때 호출되는 메서드를 참조합니다.

System_CAPS_pubdelegateComparison<T>

동일한 형식의 두 개체를 비교하는 메서드를 나타냅니다.

System_CAPS_pubdelegateConsoleCancelEventHandler

CancelKeyPress의 System.Console 이벤트를 처리할 메서드를 나타냅니다.

System_CAPS_pubdelegateConverter<TInput, TOutput>

개체의 형식을 다른 형식으로 변환 하는 메서드를 나타냅니다.

System_CAPS_pubdelegateCrossAppDomainDelegate

사용 하는 DoCallBack 대 한 응용 프로그램 간 도메인 호출 합니다.

System_CAPS_pubdelegateEventHandler

이벤트 데이터가 없는 이벤트를 처리할 메서드를 나타냅니다.

System_CAPS_pubdelegateEventHandler<TEventArgs>

이벤트에서 데이터를 제공하는 경우 이벤트를 처리할 메서드를 나타냅니다.

System_CAPS_pubdelegateFunc<TResult>

매개 변수가 없으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>

9 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>

10 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult>

11 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult>

12 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult>

13 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>

14 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>

15 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>

매개 변수가 16 개이고 하 여 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult 매개 변수입니다.

System_CAPS_pubdelegateFunc<T, TResult>

매개 변수가 하나이고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다.

이 유형에 대 한.NET Framework 소스 코드를 찾아보려면 참조는 Reference Source합니다.

System_CAPS_pubdelegateFunc<T1, T2, TResult>

2개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, TResult>

3개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, TResult>

4개의 매개 변수가 있으며 TResult 매개 변수에서 지정한 형식의 값을 반환하는 메서드를 캡슐화합니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, TResult>

5 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, TResult>

6 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, TResult>

7 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다.

System_CAPS_pubdelegateFunc<T1, T2, T3, T4, T5, T6, T7, T8, TResult>

8 개의 매개 변수가 지정 된 형식의 값을 반환 하는 메서드를 캡슐화는 TResult매개 변수입니다.





Action 대리자


1. 매개 변수가 없고 값을 반환하지 않는 메서드를 캡슐화합니다.

<구문>

public delegate void Action()


<설명>

1. 이 대리자를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고 메서드를 매개변수에 전달할 수 있습니다.

2. 캡슐화된 메서드는 이 대리자에 의해 정의된 메서드 시그니처와 일치해야(correspond to) 합니다.

3. 즉, 캡슐화된 메서드가 매개 변수가 없고 반환 값이 없어야 합니다.

4. C#의 경우 이 메서드는 void를 반환해야 합니다.

5. 비주얼 베이직의 경우 Sub...End Sub 구문을 사용하여 정의해야 합니다.

6. 무시되는 값을 반환하는 메서드일 수도 있습니다.

7. 일반적으로(Typically) 이러한 메서드는 작업(a operation)을 수행하는 데 사용됩니다.

System_CAPS_note참고

매개 변수가 없고 값을 반환하는 메서드를 참조하려면 제네릭 Func<TResult> 대리자를 대신 사용합니다.

8. Action 대리자를 사용하는 경우에는 매개 변수가 없는 프로시저를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.

9. 예를 들어 다음 코드에서는 ShowValue라는 대리자를 명시적으로 선언하고 Name.DisplayToWindow 인스턴스 메서드에 대한 참조를 해당 대리자 인스턴스에 할당합니다.

using System;
using System.Windows.Forms;

public delegate void ShowValue();

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      ShowValue showMethod = testName.DisplayToWindow;
      showMethod();
   }
}


10. 다음 예제에서는 새 대리자를 명시적으로 명명된 메서드를 할당하는 대신 Action 대리자를 인스턴스화하여 이 코드를 간소화합니다(simplify).

using System;
using System.Windows.Forms;

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class testTestDelegate
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = testName.DisplayToWindow;
      showMethod();
   }
}


11. C#에서는 다음 에제와 같이 Action 대리자를 무명 메서드와 함께 사용할 수도 있습니다.

12. 무명 메서드에 대한 소개는 무명 메서드(C# 프로그래밍 가이드)를 참조하십시오.

using System;
using System.Windows.Forms;

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class Anonymous
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = delegate() { testName.DisplayToWindow();} ;
      showMethod();
   }
}


13. 다음 예제와 같이 Action 대리자 인스턴스에 람다 식을 할당할 수도 있습니다.

14. 람다 식에 대한 소개는 람다 식(C# 프로그래밍 가이드)를 참조하십시오.

using System;
using System.Windows.Forms;

public class Name
{
   private string instanceName;

   public Name(string name)
   {
      this.instanceName = name;
   }

   public void DisplayToConsole()
   {
      Console.WriteLine(this.instanceName);
   }

   public void DisplayToWindow()
   {
      MessageBox.Show(this.instanceName);
   }
}

public class LambdaExpression
{
   public static void Main()
   {
      Name testName = new Name("Koani");
      Action showMethod = () => testName.DisplayToWindow();
      showMethod();
   }
}





Func<TResult> 대리자


1. 매개 변수가 없고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다.

<구문>

public delegate TResult Func<out TResult>()

<반환 값>

이 대리자로 캡슐화되는 메서드의 반환 값입니다.

<형식 매개 변수>

이 대리자로 캡슐화되는 메서드의 반환 값 형식입니다.

<설명>

1. 이 대리자를 사용하면 사용자 지정 대리자를 명시적으로 선언하지 않고 매개 변수로 전달할 수 있는 메서드를 나타낼 수 있습니다.

2. 캡슐화된 메서드는 이 대리자에 의해 정의되는 메서드 시그니처와 일치해야 합니다.

3. 즉, 캡슐화된 메서드에는 매개 변수가 없어야 하고 값을 반환해야 합니다.

System_CAPS_note참고

매개 변수가 없고 void(Visual Basic의 경우 Function이 아니라 Sub로 선언됨)를 반환하는 메서드를 참조하려면 Action 대리자를 대신 사용합니다.

4. Func<TResult> 대리자를 사용하는 경우에는 매개 변수가 없는 메서드를 캡슐화하는 대리자를 명시적으로 정의할 필요가 없습니다.

5. 예를 들어, 다음 코드에서는 WriteMethod라는 대리자를명시적으로 선언하고 OutputTarget.SendToFile 인스턴스 메서드에 대한 참조를 해당 대리자 인스턴스에 할당합니다.

using System;
using System.IO;

delegate bool WriteMethod();

public class TestDelegate
{
   public static void Main()
   {
      OutputTarget output = new OutputTarget();
      WriteMethod methodCall = output.SendToFile;
      if (methodCall())
         Console.WriteLine("Success!"); 
      else
         Console.WriteLine("File write operation failed.");
   }
}

public class OutputTarget
{
   public bool SendToFile()
   {
      try
      {
         string fn = Path.GetTempFileName();
         StreamWriter sw = new StreamWriter(fn);
         sw.WriteLine("Hello, World!");
         sw.Close();
         return true;
      }  
      catch
      {
         return false;
      }
   }
}


6. 다음 예제에서는 새 대리자를 명시적으로 정의하고 명명된 메서드를 할당하는 대신 Func<TResult> 대리자를 인스턴스화하여 이 코드를 간소화합니다.

using System;
using System.IO;

public class TestDelegate
{
   public static void Main()
   {
      OutputTarget output = new OutputTarget();
      Func<bool> methodCall = output.SendToFile;
      if (methodCall())
         Console.WriteLine("Success!"); 
      else
         Console.WriteLine("File write operation failed.");
   }
}

public class OutputTarget
{
   public bool SendToFile()
   {
      try
      {
         string fn = Path.GetTempFileName();
         StreamWriter sw = new StreamWriter(fn);
         sw.WriteLine("Hello, World!");
         sw.Close();
         return true;
      }  
      catch
      {
         return false;
      }
   }
}


7. C#에서는 다음 예제와 같이 Func<TResult> 대리자를 무명 메서드와 함께 사용할 수 있습니다.

8. 무명 메서드에 대한 소개는 무명 메서드(C#)를 참조하십시오.

using System;
using System.IO;

public class Anonymous
{
   public static void Main()
   {
      OutputTarget output = new OutputTarget();
      Func<bool> methodCall = delegate() { return output.SendToFile(); };
      if (methodCall())
         Console.WriteLine("Success!"); 
      else
         Console.WriteLine("File write operation failed.");
   }
}

public class OutputTarget
{
   public bool SendToFile()
   {
      try
      {
         string fn = Path.GetTempFileName();
         StreamWriter sw = new StreamWriter(fn);
         sw.WriteLine("Hello, World!");
         sw.Close();
         return true;
      }  
      catch
      {
         return false;
      }
   }
}


9. 다음 에제와 같이 Func<TResult> 대리자에 람다 식을 할당할 수도 있습니다.

10. 람다 식에 대한 소개는 람다 식(비주얼 베이직) 및 식 람다(C#)를 참조하십시오.

using System;
using System.IO;

public class Anonymous
{
   public static void Main()
   {
      OutputTarget output = new OutputTarget();
      Func<bool> methodCall = () => output.SendToFile(); 
      if (methodCall())
         Console.WriteLine("Success!"); 
      else
         Console.WriteLine("File write operation failed.");
   }
}

public class OutputTarget
{
   public bool SendToFile()
   {
      try
      {
         string fn = Path.GetTempFileName();
         StreamWriter sw = new StreamWriter(fn);
         sw.WriteLine("Hello, World!");
         sw.Close();
         return true;
      }  
      catch
      {
         return false;
      }
   }
}


11. 람다 식의 내부 형식(The underlying type)은 제네릭 Func 대리자 중 하나입니다.

12. 이를 통해 람다 식을 대리자에 명시적으로 할당하지 않고 매개 변수로 전달할 수 있습니다.

13. 특히(In particular), System.Linq 네임스페이스에 있는 형식의 많은 메서드는 Func 매개 변수를 가지므로, Func 대리자를 명시적으로 인스턴스화하지 않고도 이러한 메서드에 람다 식을 전달할 수 있습니다.

14. 계산이 매우 복잡하여(an expensive computation) 결과가 실제로 필요한 경우에만 계산을 실행하려는 경우 이러한 함수를 Func<TResult> 대리자에 할당합니다.

15. 그러면 계산이 해당 값에 액세스하는 속성이 식에서 사용될 때까지 함수의 실행을 지연할 수 있습니다.

16. 다음 단원의 예제에서는 이러한 방법을 보여 줍니다.

<예제>

1. 다음 예제에서는 매개 변수가 없는 대리자를 사용하는 방법을 보여 줍니다.

2. 이 코드에서는 Func<TResult> 형식의 필드가 있는 LazyValue라는 제네릭 클래스를 만듭니다.

3. 이 대리자 필드에는 LazyValue 객체의 형식 매개 변수와 일치하는 형식의 값을 반환하는 모든 함수에 대한 참조가 저장될 수 있습니다.

4. LazyValue 형식에는 함수가 아직 실행되지 않은 경우 함수를 실행하고 결과 값을 반환하는 Value 속성도 있습니다.

5. 이 에제에서는 두 가지 메서드를 만들고 이러한 메서드를 호출하는 람다 식이 있는 LazyValue 개체 두 개를 인스턴스화합니다.

6. 이 람다 식은 메서드를 호출하기만 하므로 매개 변수가 없습니다.

7. 출력을 통해 확인할 수 있듯이 두 메서드는 각 LazyValue 객체의 값을 검색할 때만 실행됩니다.

using System;

static class Func1
{
   public static void Main()
   {
      // Note that each lambda expression has no parameters.
      LazyValue<int> lazyOne = new LazyValue<int>(() => ExpensiveOne());
      LazyValue<long> lazyTwo = new LazyValue<long>(() => ExpensiveTwo("apple"));

      Console.WriteLine("LazyValue objects have been created.");

      // Get the values of the LazyValue objects.
      Console.WriteLine(lazyOne.Value);
      Console.WriteLine(lazyTwo.Value);
   }

   static int ExpensiveOne()
   {
      Console.WriteLine("\nExpensiveOne() is executing.");
      return 1;
   }

   static long ExpensiveTwo(string input)
   {
      Console.WriteLine("\nExpensiveTwo() is executing.");
      return (long)input.Length;
   }
}

class LazyValue<T> where T : struct
{
   private Nullable<T> val;
   private Func<T> getValue;

   // Constructor.
   public LazyValue(Func<T> func)
   {
      val = null;
      getValue = func;
   }

   public T Value
   {
      get
      {
         if (val == null)
            // Execute the delegate.
            val = getValue();
         return (T)val;
      }
   }
}
/* The example produces the following output:

    LazyValue objects have been created.

    ExpensiveOne() is executing.
    1

    ExpensiveTwo() is executing.
    5
*/    






'프로그래밍 > C#' 카테고리의 다른 글

형 변환 예제  (0) 2016.07.10
StringBuilder 클래스  (0) 2016.07.09
String.Format 메서드  (0) 2016.06.28
String 클래스  (0) 2016.06.22
Windows Forms 컨트롤의 다중 스레딩  (0) 2016.06.21
:
Posted by 지훈2
2016. 7. 7. 12:54

string 프로그래밍/Python2016. 7. 7. 12:54

string

https://docs.python.org/3/library/string.html



6.1.3 Format String Syntax


1. 포맷 문자열은 중괄호 {}로 된 치환 필드를 포함한다.

2. 중괄호 안에 포함된 모든 것은 일반 텍스트로 간주되고 출력물에는 변경 없이 그대로 복사된다.

3. 일반 텍스트로 중괄호를 표현한다면 중괄호를 두개 써라. {{ 또는 }}


replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | integer]
attribute_name    ::=  identifier
element_index     ::=  integer | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

4. 버전 3.1부터 위치 인수 지정자를 생략할 수 있다. 예) '{} {}' 은 '{0] {1]' 과 같다.

"First, thou shalt count to {0}"  # References first positional argument
"Bring me a {}"                   # Implicitly references the first positional argument
"From {} to {}"                   # Same as "From {0} to {1}"
"My quest is {name}"              # References keyword argument 'name'
"Weight in tons {0.weight}"       # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}"   # First element of keyword argument 'players'.
"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first


6.1.3.1. Format Specification Mini-Language


1. 일부 포맷 옵션들은 숫자 형에서만 지원된다.

2. 일반 변환에서 빈 포맷 문자열("")은 값에 str()을 호출한 것과 같은 결과를 가진다.

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

3. 유효한 align 값이 지정되면, 모든 문자가 가능한 fill 문자가 앞에 올 수 있고 생략되면 기본값은 공백이 된다.

4. str.format() 메서드를 사용할 때 fill 문자로 중괄호("{" 또는 "}")의 사용은 불가능하다.

11. 그러나 중첩된 교체 필드로 중괄호를 삽입하는 것은 가능하다.

12. 제한은(limitation)은 format() 함수에 영향을 미치지 않는다.

13. 다양한 맞춤(alignment) 옵션의 의미는 다음과 같다.

 Option

 Meaning

 '<'

 필드를 이용 가능한 공간 내에서 왼쪽 맞춤한다. (대부분의 객체의 기본값이다.)

 '>'

 필드를 이용 가능한 공간 내에서 오른쪽 맞춤한다. (숫자의 기본값)

 '='

 1. 패딩이 기호 뒤에 오고 숫자 앞에 온다. '+000000120' 형태에서 프린팅 필드에 사용된다.

 2. 이 맞춤 옵션은 숫자 형식에서만 유효하다.

 3. '0'이 필드 너비 앞에 바로 오면 기본값이 된다.

 '^' 필드가 이용 가능한 공간 공간 내에서 가운데에 위치한다.

14. 최소 필드 너비가 정의되지 않으면 필드 너비는 데이터와 같은 크기가 된다.

15. 그래서 이런 경우 맞춤 옵션이 의미가 없다.

16. sign 옵션은 숫자 형에서만 유효하고 다음 중에 하나가 될 수 있다.

Option

Meaning

 +

 양수, 음수 모두에 사용

 -

 음수에만 사용 (기본값)

 space

 양수에는 앞에 공백이, 음수에는 마이너스 기호가 사용


17. '#' 옵션은 '대체 형식'(alternate form)을 변환에 사용되도록 한다.

18. 이 옵션은 integer, float, comples와 Decimal types에만 유효

19. integers인 경우 binary, octal, hexadecimal 출력이면, 각각의 프리픽스를'0b', '0o', '0x' 출력 값에 추가한다.

20. floats, comples와 Decimal의 경우 대체 형식은 변환 결과가 항상 소수점을 포함하도록 한다.

21. 숫자가 뒤에 오지 않더라도 포함한다.

22. 'g', 'G' 변환에서는 뒤에 0들이 제거되지 않는다.


23. ',' 옵션은 천단위 컴마 사용입니다.

24. 지역 인식 구분자는 'n' integer presentation type을 사용.


# 버전 3.1에서 ',' 옵션 추가됨


25. 명시적 alignment가 없다면 width 필드 앞에 0이 오면 기호 인식 제로 패딩을 적용한다.

26. precision은 'f' 및 'F' 로 포맷된 부동 소수점 값의 소수 점 뒤에 또는 'g'와 'G'로 포맷된 부동 소수점 값의 소수 점 앞 뒤에 표시되는 숫자를 decimal 숫자이다.

27. 숫자가 아닌 형식에서 precision은 최대 필드 크기이다. 다시 말해서 필드 내용의 문자의 수이다.

28. integer 값에는 허용되지 않는다.


29. 마지막으로 type은 데이터 타입을 결정한다.


30. 문자열 가능 형식

 Type

 Meaning

 's'

 문자열 포맷, 문자열의 기본형이고 생략가능하다.

 None

 's'와 같다.


31. 정수형 가능 형식

 Type

 Meaning

 'b'

 바이너리 포맷. 2진수

 'c'

 문자. 출력 전에 integer를 해당 유니코드 문자로 변환

 'd'

 Decimal Integer. 10진수

 'o'

 Octal 포맷. 8진수

 'x'

 16진수. 소문자

 'X'

 16진수. 대문자

 'n'

 숫자. 현재 로케일 환경을 사용해서 적절한 숫자 구분자 문자를 삽입을 제외하고는 'd'와 같다.

 None

 'd'와 같다.


31. integers는 아래 목록의 부동 소수점 타입으로 ('n'와 None 제외) 포맷될 수 있다

32. 그러면 float()이 사용되어 integer를 부동소수점 값으로 바꾼다.


33. 부동 소수점 형식과 decimal 의 가능한 값

 Type

 Meaning

 'e'

 지수 표기법. 'e' 사용. 기본 자릿수는 6

 'E'

 지수 표기법. 'E' 사용.

 'f'

 부동 소수점. 기본 소수 자릿수는 6

 'F'

 부동 소수점. 'f'와 같지만, nan을 NAN으로 ini를 INF로 변환

 'g'

 일반적인 포맷

 'G'

 일반적인 포맷. 숫자가 너무 커지면 "E"로 변환되는 것을 빼고는 'g'와 같다. infinity와 NaN은 대문자화

 'n'

 숫자. 'g'와 같지만 현재 로케일 설정을 사용해서 적절한 구분자를 삽입

 '%'

 퍼센트. 숫자를 100으로 곱하고 'f' 포맷으로 표시. % 기호가 뒤에 옴

 None

  'g'와 비슷. 고정 소수점 표기법이 사용되면 소수 점 이후에 최소 하나의 숫자를 가진다




예제


1. 여기에서는 str.format() 문법과 구식 %-포맷팅을 비교한다.

2. 대부분의 경우 구식 %-포맷팅과 비슷하지만 % 대신에 {}와 : 가 추가되었다.

3. 예를 들면 %03.2f는 {:03.2f}로 해석될 수 있다.



위치로 인수 접근

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'


인수의 속성으로 접근

>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'


인수의 항목으로 접근

>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'


%s와 %r을 교체

>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"


정렬 및 너비 지정

>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'


%+f, %-f, % f를 교체 그리고 사인 지정

>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'


%x와 %o를 교체하고 값을 다른 베이스로 변환

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'


천 단위 구분자로 컴마 사용

>>> '{:,}'.format(1234567890)
'1,234,567,890'


퍼센트 표현

>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'


타입 지정 포맷팅

>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'


중첩된 인수 및 더 복잡한 예제

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12): 
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011




:
Posted by 지훈2