Program Language
-
[Python] 파이썬 핵심만 정리한 반복문 for/while2023.09.04
-
[Python] 파이썬 핵심만 정리한 조건문 if/else2023.06.12
-
[C#] C#에서 TLS 1.2를 사용하도록 변경하기2023.03.24
[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 |
[Python] 파이썬 핵심만 정리한 반복문 for/while
Summary |
프로그래밍을 진행할때 가장 많이 사용하는 구문이 제어문과 반복문인데요. python에서 사용되는 반복문의 종류에는 for 문과 while 문이 있습니다.
▶ 반복문 ◀ |
반복문은 제어문중의 하나로, 프로그램 소스 코드내에서 특정한 부분의 코드가 반복적으로 수행 될 수 있도록 하는 구문입니다.
프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나입니다.
Python 에서는 for 문과, while 문이 반복문에 해당이 됩니다.
▶ for 문 ◀ |
for문은 특정 값들의 집합의 대해 코드의 일부분을 반복하는 구문입니다.
for 문의 기본적인 구문은 아래와 같습니다.
for item in list of items:
# do something
주로 list 자료형을 이용해서 for 문을 구현하며, 순차적인 리스트를 반환하는 range 함수와 같이 사용되기도 합니다.
# 샘플
fruits = ["Apple", "Peach", "Pear"]
for fruit in fruits:
print(fruit)
>>>
Apple
Peach
Pear
▶ for 문과 자주 사용되는 range 함수 ◀ |
range(start, end, step) 함수는 start 와 end 사이의 연속적인 숫자들을 리턴하는 함수 이며, for 문과 자주 사용되는 함수 입니다. 유의사항은 end의 숫자는 포함되지 않은 숫자까지 리턴된다는 점입니다.
range(start, end, step)
range의 syntax는 위와 같고 stop과 step은 생략 가능합니다.
- start : start로 시작되는 숫자부터 리턴됩니다.
- end : end가 포함되지 않는 숫자까지 리턴됩니다.
- step : 연속적인 숫자들 중에, step의 간격에 해당되는 숫자들만 리턴됩니다.
for item in range(a, b):
print(item)
for 문과 같이 사용할 경우, 위 예시처럼 사용가능하며, 자세한 예시는 아래 첨부 합니다.
# 1부터 10까지의 개념이며, 10을 포함하지 않음
for number in range(1,10):
print(number)
total = 0
for number in range(1, 101):
if number % 2 == 0:
total += number
print(total)
total = 0
for number in range(2, 101, 2):
total += number
print(total)
▶ while 문 ◀ |
조건이 참일 때마다, 들여쓰기 된 코드들을 실행하는 반복 실행문.
for문은 end 조건이 정해져 있지만, while loop 는 infinite loop 개념이라, 조건문에 유의 해야 합니다.
while someting_is_true:
# do something
기본적은 구문은 위의 내용과 같으며, 아래는 이를 이용한 예시입니다.
# 샘플
i = 0
while i < 100:
print(f"i = {i}")
i += 1
# 출력
i = 0
i = 1
...
i = 99
Reference |
https://velog.io/@chappi/파이썬을-배워보자-9일차-반복문while-for
https://www.freecodecamp.org/korean/news/python-for-loop-for-i-in-range-example/
END
'Program Language > Python' 카테고리의 다른 글
[Python] 파이썬 핵심만 정리한 조건문 if/else (0) | 2023.06.12 |
---|---|
[Python] 파이썬 입력 함수 - input() (0) | 2023.03.21 |
[Python] 파이썬 출력 함수 - print() (0) | 2023.02.17 |
[Python] 가볍게 파이썬 학습 및 디버깅하기 좋은 툴 추천! Thonny (1) | 2023.02.01 |
[Python] Windows 환경에 Python 설치하기! (0) | 2023.01.27 |
[Python] 파이썬 핵심만 정리한 조건문 if/else
Summary |
조건문은 모든 언어에서 가장 많이 사용하는 프로그래밍 구문중에 하나입니다. Python 에서 사용되는 조건문 형식에 대해서 간략하게 핵심만 정리해 보았습니다.
## 조건문이란? |
조건문이란 어떤 조건이 주어질 때 어떤 동작을 수행하도록 할지, 즉 조건에 따라 실행이 달라지게 할 때 사용되는 문장입니다.
Boolean 자료형 조건이 참인지, 혹은 거짓인지에 따라 달라지는 상황을 수행하는 명령문입니다.
## 조건문형식 |
if condition:
do A
else:
do B
if/else의 기본 조건문은 위 화면과 같습니다. 해당 조건문 옆에 : 콜론으로 타 언어의 { } 를 대체합니다.
if condition1:
do A
elif condition2:
do B
else:
do C
else if 의 조건문 형태는 elif 구문으로 사용합니다.
## 조건문 유형 : 비교연산자 |
- > : 왼쪽의 값이 클경우
- < : 왼쪽의 값이 작을 경우
- >= : 왼쪽의 값이 크거나 같을 경우
- <= : 왼쪽의 값이 작거나 같을 경우
- == : 두 값이 같을 경우
- != : 두 값이 다를 경우
if 5 > 1:
do A
if 5 < 1:
do A
if 5 >= 1:
do A
if 5 <= 1:
do A
if 5 == 5:
do A
if 5 != 1:
do A
## 조건문 유형 : 논리연산자 |
- and : 두가지 조건문 모두 참일 경우 True, 아니면 False
- or : 두가지 조건문 중 하나라도 참일 경우 True, 아니면 False
- not : 조건문이 거짓이면 True, 참이면 False
// 두 조건일 참일 경우
if condition1 and condition2:
do A
else:
do B
// 두가지 조건중 하나만 참일 경우
if condition1 or condition2:
do A
else:
do B
// 조건이 False 일 경우 do A
if not condition1:
do A
else:
do B
참조 |
END
'Program Language > Python' 카테고리의 다른 글
[Python] 파이썬 핵심만 정리한 반복문 for/while (0) | 2023.09.04 |
---|---|
[Python] 파이썬 입력 함수 - input() (0) | 2023.03.21 |
[Python] 파이썬 출력 함수 - print() (0) | 2023.02.17 |
[Python] 가볍게 파이썬 학습 및 디버깅하기 좋은 툴 추천! Thonny (1) | 2023.02.01 |
[Python] Windows 환경에 Python 설치하기! (0) | 2023.01.27 |
[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 |