Program Language/C#
-
[C#] C#에서 TLS 1.2를 사용하도록 변경하기2023.03.24
-
[C#] 특정 소수점 이하 올림, 버림 처리하기2022.05.19
-
[C#] C#에서의 반올림, 올림, 버림 처리2022.05.18
[C#] C# List Shuffle 하는 방법, Random()으로 순서 섞기
1. Linq OrderBy()를 사용해서 목록 섞기
public static List<string> Shuffle(List<string> values)
{
Random rand = new Random();
var shuffled = values.OrderBy(_ => rand.Next()).ToList();
return shuffled;
}
Linq의 OrderBy() 메소드를 이용하면, 지정된 비교자를 사용하여 시퀀스의 요소를 정렬합니다.
Random()을 사용해서 순서를 무작위로 섞기 위해 위와 같이 메소드를 구성 할 수 있는데요.
static void Main(string[] args)
{
List<string> values = new List<string>() { "A", "B", "C", "D", "E" };
var valuse2 = EtcUtil.Shuffle(values);
foreach (var item in valuse2)
{
Console.WriteLine(item);
}
}
저는 Method를 구성해서 호출하는 방식을 이용했고, 위와같이 호출하면, 아래의 출력결과를 얻을 수 있습니다.
출력 :
2. Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기
public static class Extensions
{
private static Random random = new Random();
public static void Shuffle<T>(this IList<T> values)
{
for (int i = values.Count - 1; i > 0; i--)
{
int k = random.Next(i + 1);
T value = values[k];
values[k] = values[i];
values[i] = value;
}
}
}
Fisher-Yates 셔플 알고리즘은 C#에서 데이터 구조를 Shuffle합니다.
Fisher-Yates 셔플 알고리즘은 Random.Next() 함수를 사용해 얻은 인덱스값(k)을 현재의 순서 (i) 와 바꿔주는 역활을 합니다. 이 경우 편향되지 않은 배열을 생성해주며, 시간 복잡도 O(n) 으로 빠른편에 속합니다.
위의 코드는 C#에서 Fisher-Yates 셔플 알고리즘을 사용하여 목록을 셔플하는 방법을 보여줍니다.
static void Main(string[] args)
{
List<int> values = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
values.Shuffle();
foreach (var item in values)
{
Console.WriteLine(item);
}
}
static Method 를 이용해서 구현했고, Shuffle() Method 에 this 인자를 이용해서 구성하였기 때문에,
외부 함수를 맴버 함수처럼 호출 할 수 있게 해줍니다.
그래서 Extension Method 의 느낌을 더 잘 나타낼수 있습니다.
출력 :
참조
https://www.delftstack.com/ko/howto/csharp/shuffle-a-list-in-csharp/
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
END
'Program Language > C#' 카테고리의 다른 글
[C#] 문자열 서식, string.Format() 및 보간을 이용한 간격 맞추기 (1) | 2023.12.18 |
---|---|
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시 (0) | 2023.09.11 |
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[C#] 문자열 서식, string.Format() 및 보간을 이용한 간격 맞추기
프로그램을 개발하면서 소소하게 많이 접하게 되는것이 문자열관련, 날짜관련이 아닐까 싶은데요. 그중 Log 성 데이터를 다루다 보면 문자열 관련된 내용이 꼭 필요하게 됩니다. Log와 관련된 내용을 좀더 가독성이 좋게 만들면 좋을 거 같아서 보간을 이용한 간격을 맞췄는데요. 진행한 김에 같이 정리하였습니다.
1. string.Format 을 이용한 문자열 출력
string.Format() 의 메소드 매개변수 형식은 아래와 같은데요.
{첨자, 맞춤:서식 문자열}
해당 메소드를 이용하면 위와같은 형태로 문자열을 출력할 수 있습니다.
2. PadRight() PadLeft() 를 이용한 간격맞춤
간혹 문자열의 간격을 조정해야 하는 상황이 발생하게 되는데요.
이때는 PadRight(), PadLeft() 메소드를 이용하시면 우측간격과, 좌측간격을 조정해서
위와 같은 형태로 출력화면을 컨트롤 할 수 있는데요.
3. $을 이용한 문자열 보간
$ 문자는 문자열 리터럴을 보간된 문자열로 식별합니다. 보간된 문자열은 보간 식이 포함될 수 있는 문자열 리터럴입니다. 보간된 문자열이 결과 문자열로 해석되면 보간 식이 있는 항목이 식 결과의 문자열 표현으로 바뀝니다.
var name = "Mark";
var date = DateTime.Now;
// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.
C# 10부터 보간된 문자열을 사용하여 상수 문자열을 초기화할 수 있습니다. 보간된 문자열 내의 모든 보간 식이 상수 문자열인 경우에만 이 작업을 수행할 수 있습니다.
4. 보간을 이용한 출력
위 예제에서는 string.Format() 메소드를 이용했지만, 보간을 이용하면 간단하게 구문을 줄 일 수 있습니다.
앞에 $ 리터럴 문자만 넣어주시면 보간을 이용 할 수 있는데요.
코딩에 대한 부분이 간편해진 것을 볼 수 있습니다.
5. 보간을 이용한 간단한 줄맞춤 서식
PadRight(), PadLeft() 메소드도 보간을 이용하면, 간편하게 +/- 정수형을 이용해서 좌측/우측 간격을 조절할 수 있어서 간편하게 이용할 수 있습니다.
참조
END
'Program Language > C#' 카테고리의 다른 글
[C#] C# List Shuffle 하는 방법, Random()으로 순서 섞기 (1) | 2024.01.22 |
---|---|
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시 (0) | 2023.09.11 |
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시
들어가며 |
프로그램을 설계하고 코딩하는 과정에서, 각 어플리케이션의 요소 (클래스, 메소드, 구조체 등등) 를 변경하는 과정은 자주 발생하게 됩니다. 협업하는 과정에서 즉시 수정이 가능하면 좋지만, 시간을 두고 천천히 제외 해야 할 요소라면, 작업자 간의 자연스러운 공유 및 수정을 유도하는 것도 하나의 방법인데요.
꼭 제외에만 초점을 맞춘다기 보다는 Framework 의 변경, 추가 Method 생성 등도 이유가 될 수 있을 겁니다.
이때 사용하기 좋은 특성 중 에 하나가 [Obsolete] 입니다.
▶ ObsoleteAttribute ◀ |
더 이상 사용하지 않거나, 그럴 예정인 어플리케이션 요소를 표시하는데 사용되는 특성이며,
[Obsolete] 특성 (Attribute)을 붙여주는 방식으로 사용하게 됩니다.
▶ 기본 형식 ◀ |
[Obsolete("사용안함", false)]
public bool TestMethods()
{
return true;
}
위와 같이 Method 나, Class 등등 어플리케이션 요소 상단에 [Obsolete] 특성을 기재하는 방식으로 사용하게 됩니다.
Obsolete 옵션으로 Message 와 IsError 컴파일 에러 여부를 선택할 수 있는 옵션으로 구성되어져 있으며,
true 로 선택할 경우, 컴파일시 Error을 발생하게 됩니다.
▶ 사용 예제 ◀ |
IsError false 일 경우, ~~~~ 표시로 사용자에게 경고만 되며, 컴파일은 정상적으로 진행됩니다.
반면, IsError true 일 경우, ~~~~ 붉은 색으로 표시되며 컴파일시 에러를 발생하게 됩니다.
▶ Obsolete의 어플리케이션 요소 ◀ |
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Struct |
AttributeTargets.Enum |
AttributeTargets.Constructor |
AttributeTargets.Method |
AttributeTargets.Property |
AttributeTargets.Field |
AttributeTargets.Event |
AttributeTargets.Interface |
AttributeTargets.Delegate, Inherited = false)]
Obsolete 특성은 AttributeTargets Enum을 기준으로 동작하며,
Assembly, Module, Parameter, ReturnValue, GenericParameter, All 을 제외한 요소에서 사용됩니다.
▶ 적용대상 ◀ |
참조 |
https://learn.microsoft.com/ko-kr/dotnet/api/system.obsoleteattribute?view=net-7.0
END
'Program Language > C#' 카테고리의 다른 글
[C#] C# List Shuffle 하는 방법, Random()으로 순서 섞기 (1) | 2024.01.22 |
---|---|
[C#] 문자열 서식, string.Format() 및 보간을 이용한 간격 맞추기 (1) | 2023.12.18 |
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[C#] C#에서 TLS 1.2를 사용하도록 변경하기
.
들어가며
.NET Framework 4.8 개발 환경에서, 기본적인 TLS 전송에 대한 프로토콜 버전이 1.0으로 전송된다는 얘기를 전해들었습니다. 이와 관련해서 서버에서는 1.2 를 지원하고 있어서 원활한 통신이 안되고 있다는 얘기에, 관련상황을 정리하였습니다.
TLS란?
TLS(전송 계층 보안) 프로토콜은 인터넷을 통해 전달되는 개인 정보를 보호하는 데 도움이 되도록 설계된 업계 표준입니다.
TLS는 국제 표준 기구인 IETF(Internet Engineering Task Force)에 의해 제안되었으며 프로토콜의 첫 번째 버전은 1999년에 발표되었습니다. 가장 최신 버전은 2018년에 발표된 TLS 1.3입니다.
TLS는 Netscape가 개발한 SSL(Secure Sockets Layer)이라고 불리는 이전의 암호화 프로토콜에서 발전한 것입니다.
TLS 버전 1.0은 SSL 버전 3.1로서 개발을 시작했지만 Netscape와 더 이상 연관이 없음을 명시하기 위해 발표 전에 프로토콜의 이름이 변경되었습니다.
이러한 역사 때문에 용어 TLS와 SSL은 가끔 서로 바꿔서 사용됩니다.
.NET Framework TLS 1.2에 대한 지원
앱이 TLS 1.2를 협상하려면 OS 및 .NET Framework 버전이 모두 TLS 1.2를 지원해야 합니다.
- TLS 1.2의 경우 앱에서 .NET Framework 4.7 이상 버전을 대상으로 하고, WCF 앱에서 .NET Framework 4.7.1 이상 버전을 대상으로 합니다.
- TLS 1.3의 경우 .NET Framework 4.8 이상을 대상으로 합니다.
현 상황
위에 표를 보게 되면 Windows Server 2012 상위 버전은 기본적으로 사용하도록 설정된다고 하였으나,
실질적으로 테스트 했을때는 그러지 않았습니다.
동일한 현상에 대해서 테스한 코드가 있어서 참조하였습니다.
string url = "https://www.google.com";
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
var resp = req.GetResponse();
var outStream = resp.GetResponseStream();
string output = "";
using (StreamReader rdr = new StreamReader(outStream))
{
output = rdr.ReadToEnd();
}
저희 코드의 개발환경은 2016 Server에 .NET Framework 4.8 이였습니다.
TLS 1.2 활성화
위에 처럼 진행했을 경우, TLS 가 1.0 버전으로 통신이 되어, 아래처럼 코드를 수정해서 테스트 했습니다.
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
...
...
(HttpWebRequest)WebRequest.Create(url) 이전에
추가로 프로토콜을 명시해 줌으로써, TLS 1.2 로 통신하는 모습을 확인 할 수 있었습니다.
동일한 현상을 겪었으나, 이미지 캡쳐본이 사라져서 타 blog 의 이미지를 첨부하였습니다.
MSDN
MSDN 에서는 .NET Framework 애플리케이션이 안전하게 유지되도록 하려면, TLS 버전을 하드 코드 하면 안된다고 합니다. .NET Framework 애플리케이션에서는 OS가 지원하는 TLS 버전을 사용해야 한다고 하지만,
기본적으로 사용하도록 설정된다고 하는데, 실질적으로는 코드상에서 프로토콜을 명시해줬어야 했습니다.
추가적으로 설정이 필요한것인지는 모르겠으나, regist 파일까지 수정해가면서 하고싶진 않아서, 코드상에서 처리하였습니다.
참조
http://csharp.tips/tip/article/802-using-tls-1-2-in-csharp
https://learn.microsoft.com/ko-kr/dotnet/framework/network-programming/tls#support-for-tls-12
END
'Program Language > C#' 카테고리의 다른 글
[C#] 문자열 서식, string.Format() 및 보간을 이용한 간격 맞추기 (1) | 2023.12.18 |
---|---|
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시 (0) | 2023.09.11 |
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[C#] HttpWebRequest 사용시 2개의 연결 수정 (0) | 2022.03.22 |
[C#] 특정 소수점 이하 올림, 버림 처리하기
System.Math 의 Round 메소드의 경우 기본적으로 소수점 이하 자리수를 파라메터로 제공을 하지만,
올림 (Ceiling), 버림(Truncate) 메소드의 경우에는 제공을 하지 않습니다. 그렇기 때문에 해당 처리를 별도로 해줘야 하는데요.
간단한 방법으로 특정 소수점 이하의 올림, 버림 처리를 할 수 있습니다.
특정 소수점 올림
원하는 소수점까지의 표현을 위해 값을 곱해주고 나눠주는 방식으로 표현이 가능합니다.
double value = 132.15469;
// 소수점 두자리 올림
Console.WriteLine($"Ceiling : {Math.Ceiling(value * 100) / 100}");
// 소수점 세자리 올림
Console.WriteLine($"Ceiling : {Math.Ceiling(value * 1000) / 1000}");
출력
132.16
132.155
원리
1. 132.15469 * 100 => 13215.469;
2. Ceiling(13215.469) => 13216;
3. 13216 / 100 => 132.16;
특정 소수점 버림
올림과 마찬가지 원리로, 원하는 소수점까지의 표현을 위해 값을 곱해주고 나눠주는 방식으로 표현이 가능합니다.
double value = 132.15469;
// 소수점 두자리 버림
Console.WriteLine($"Ceiling : {Math.Truncate(value * 100) / 100}");
// 소수점 세자리 버림
Console.WriteLine($"Ceiling : {Math.Truncate(value * 1000) / 1000}");
출력
132.15
132.154
원리
1. 132.15469 * 100 => 13215.469;
2. Truncate(13215.469) => 13215;
3. 13215 / 100 => 132.15;
'Program Language > C#' 카테고리의 다른 글
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시 (0) | 2023.09.11 |
---|---|
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |
[C#] HttpWebRequest 사용시 2개의 연결 수정 (0) | 2022.03.22 |
[.NET] .NET Framework 다운로드 링크 (0) | 2021.06.01 |
[C#] C#에서의 반올림, 올림, 버림 처리
C#을 이용해서 개발을 진행하다보면, System.Math 를 통해서 수학함수를 사용할 일이 생기는데요. 그중 가장 많이 사용하는 부분이 수치를 이용한 올림/반올림/버림 처리가 아닐까합니다.
자주 사용하지만, 한번 만들어 놓으면 다시 보지 않기에 정리해봅니다.
올림
올림의 경우 Math.Ceiling(double a) 메소드를 사용합니다.
double value = 132.15469;
Console.WriteLine($"Ceiling : {Math.Ceiling(value)}");
//출력
Ceiling : 133
버림
버림의 경우 Math.Truncate(double a) 메소드를 사용합니다.
double value = 132.15469;
Console.WriteLine($"Truncate : {Math.Truncate(value)}");
//출력
Truncate : 132
반올림
반올림의 경우 Math.Round(double a, int digits) 메소드를 사용합니다.
반올림의 경우에는 소수점 자리수를 지정할 수 있으며, 입력한 자리수 (digits) 까지 표현이 됩니다.
아래의 예시를 들어, 132.15469 의 3번째 자리로 반올림의 경우, 표현을 3번째 자리로 하기때문에 6을 반올림하게 됩니다.
double value = 132.15469;
// 두번째 파라미터가 없을 경우 소수점 1자리 기준
Console.WriteLine($"Round : {Math.Round(value)}");
// 소수점 3째자리 반올림
Console.WriteLine($"Round 3 : {Math.Round(value, 3)}");
//출력
Round : 132
Round 3 : 132.155
'Program Language > C#' 카테고리의 다른 글
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
---|---|
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] HttpWebRequest 사용시 2개의 연결 수정 (0) | 2022.03.22 |
[.NET] .NET Framework 다운로드 링크 (0) | 2021.06.01 |
[C#] Winform에서 Invoke 메서드 사용 (0) | 2021.04.19 |