프로그래밍 150

[C#] 코딩의기술(실전편) - 3.5 짧은쿼리 VS 긴 쿼리

1. 긴 쿼리 쿼리의 길이가 길면 코드 가독성이 떨어진다. static void Example_LongQuery() { object[] arr = { 5, 3, 2, 4, 1, "hello" }; var arr2 = arr.OfType().Where(x => x >= 2).OrderBy(x => x).Skip(1).Take(2).Select(x => x.ToString("C")).Reverse().ToArray(); foreach (var item in arr2) { Console.WriteLine(item); } } 1.1 단순 긴 쿼리 예제 2. 긴 쿼리를 자른다 긴 쿼리를 여러 개로 자르는게 좋다. 짧은 쿼리로 작성하면 계산의 중간 결과를 확인할 수 있습니다. 예제와 같이 작성하여 중간 결과를 확인..

[C#] 코딩의기술(실전편) - 3.4 배열 VS IEnumerable<T>

1. 임의 접근 임의 접근 (random access) : 순서에 관계 없이 사용할 수 있다. 갑자기 마지막 데이터를 달라고 요청할 수 있습니다. 순차 접근 (sequential access) : 앞에서부터 차례대로 사용한다. 갑자기 마지막 데이터를 꺼내서 사용할 수 없다. 처음부터 순서대로 나열됩니다. 배열은 임의 접근이 가능합니다. IEnumerable(열거 인터페이스)는 임의 접근 하지 않습니다. 순차 접근만 가능합니다. ElementAt(), ElementAtDefault() 메서드를 사용하면 인덱스 번호를 지정하여 임의 접근할 수 있는것 처럼 보일 수 있지만, 그것은 착각이다. 1.1 사용 예제 예제에서 처리시간만 두고 비교하면 배열의 처리 시간이 더 빠릅니다. 임의 접근을 해야 할 때는 배열을..

[C#] 코딩의기술(실전편) - 3.3 OrderBy VS Sort

Orderby 메서드 시퀀스의 요소를 오름차순으로 정렬합니다. 원래 데이터를 유지하면서 요소를 정렬합니다. Sort 메서드 시퀀스의 요소를 오름차순으로 정렬합니다. 원래 데이터를 제거하고, 정렬 된 새로운 데이터를 넣습니다. 사용예제 class Program { static void Main(string[] args) { int[] sortArray = { 3, 1, 2 }; int[] orderByArray = { 3, 1, 2 }; SortAndOutput(sortArray); PrintArray(sortArray); OrderByAndOutput(orderByArray); PrintArray(orderByArray); Console.ReadKey(); } private static void Prin..

[C#] 코딩의기술(실전편) - 3.2 First VS Single

First메서드 조건에 맞는 첫 번째 요소를 반환합니다. 첫 번째 요소를 발견 한 시점에 값을 반환합니다. 그 뒤에 요소들은 확인하지 않습니다. Single메서드 조건에 맞는 값이 하나만 있는 것을 확인한 다음 그 값을 반환합니다. 조건에 맞는 값을 발견 한 후에도 나머지 요소들도 확인합니다. 모든 요소들을 확인 합니다. First(), Single() 사용예제1 class Program { static void Main(string[] args) { var enumObj = Enumerable.Range(0, 1000000000); var start1 = DateTime.Now; var a = enumObj.First(x => x == 1); Console.WriteLine($"First() TEST ..

[C#] 코딩의기술(실전편) - 3.1 First와 FirstOrDefault

First 메서드 LINQ 메서드의 첫 번째 요소를 가져오는 메서드 첫 번째 요소가 없으면 예외가 발생합니다. 예외 처리가 필요합니다. FirstOrDefault 메서드 LINQ 메서드의 첫 번째 요소를 가져오는 메서드 첫 번째 요소가 없으면 기본값(참조 형식이면 null)을 반환합니다. 별도로 예외 처리가 필요없습니다. First(), FirstOrDefault() 사용 예제 class Program { static void Main(string[] args) { FirstMethod(); FirstOrDefaultMethod(); } static void FirstMethod() { string s1 = Console.ReadLine(); Console.WriteLine($"입력 된 첫 번째 문자 :..

[C#] 코딩의기술(실전편) - 2.14 테스트와 목(mock)

Mock 단위 테스트를 작성할 때 실제 클래스를 호출하기가 어려울 때가 있습니다. ex> 호출에 의해 특정 리소스가 변경되거나, 호출 시 불러오는 값이 고정되지 않은 경우. 이때는 고정값을 반환하는 객체인 목(mock)을 사용해서 테스트하는 것이 수월합니다. Mock의 특징 목 객체를 활용한 테스트는 직접 개발자가 목 객체를 만들어야 합니다. 목을 사용하면 코딩의 양도 늘고, 실행 시간도 늘어나서 목에 의존하지 않는 메서드를 설계해야합니다. 목을 사용해야만 테스트가 가능한 메서드가 있습니다. 이미 만들어져 있는 목 프레임워크를 활용하여 쉽게 목 객체 활용이 가능합니다. 해당 라이브러리만 세팅하면 쉽게 목 객체를 활용 가능합니다. 테스트 가능한 코드를 설계하면서 코드의 품질을 향상시키는 데 도움이 됩니다...

[C#] 코딩의기술(실전편) - 2.11 TryParse에서 결과를 보지 않는 경우

TryParse 메서드 String 문자열을 데이터 형으로 변환 합니다. 반환 값은 변환이 성공했는지 아니면 실패했는지를 나타냅니다. 변환 성공 : True 반환 변환 실패 : False 반환 변환에 실패하면 해당 데이터 형의 기본값을 TryParse()의 두번째 매개변수에 초기화합니다. 예제에서 r2에 데이터 형의 기본값으로 초기화 사용예제 static void Main(string[] args) { var s1 = "2021/01/01 16:44:03"; var s2 = "bad string example."; DateTime r1, r2; var b1 = DateTime.TryParse(s1, out r1); var b2 = DateTime.TryParse(s2, out r2); Console.Wr..

[C#] 코딩의기술(실전편) - 2.9 Goto 구문

goto 구문 goto 문은 레이블이 지정된 곳으로 직접 프로그램 컨트롤을 전송합니다. 일반적으로 switch 문에서 switch-case 레이블 또는 기본 레이블로 컨트롤을 전송하는 데 사용됩니다. goto 사용 예제1 switch문에서 사용 예제를 확인해봅시다. n 변수에 2를 입력받으면 switch문의 case2의 코드를 실행 후 goto문을 만나게 되면서 case 1으로 이동하여 코드를 수행하게됩니다. 3을 입력받으면 case3 -> case2 -> case1 조건으로 이동하여 코드를 수행하게됩니다.goto 사용 예제2 static void Main(string[] args) { string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0;..

[C#] 코딩의기술(실전편) - 2.7 포인터

포인터 (Pointer) C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다. char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다. 포인터를 사용하여 허가된 모든 메모리(스택) 영역에 접근할 수 있습니다. 포인터 사용에 대한 오해 - 포인터를 사용하면 성능이 향상된다.(속도가 빨라진다.) - 프로그래밍을 하려면 포인터는 넘어야 할 산이다. - 포인터를 숙지해야 진정한 프로그래머다. 포인터 사용에 대한 오해 - 반론 컴파일러가 최적화 기술이 발달하면서 성능 향상에 대한 차이가 사라졌습니다. 포인터를 잘못 사용하여 메모리 영역을 잘못 건드리게 되면 프로그램이나 시스템에 치명적인 손상을 입힐 수 있습니다. 포인..

[C#] 코딩의기술(실전편) - 2.6 unsafe

unsafe 컨텍스트 메서드, 형, 코드 블록은 unsafe로 정의할 수 있습니다. unsafe 코드로 어플리케이션 성능을 끌어올릴 수 있다. unsafe 코드는 포인터를 사용해야 하는 네이티브 함수를 호출할 때 필요합니다. unsafe 코드를 사용하면 보안성과 안정성 측면의 위험도가 커집니다. C#에서 unsafe 코드를 컴파일하려면 빌드 속성 설정이 필요합니다. unsafe 예제 C# 에서는 일반적으로 포인터를 사용하지 않습니다. 간혹 C++ 에서 사용하던 Class를 가져오면서 포인터를 사용해야 하는 경우 unsafe를 사용합니다. class UnsafeTEST { unsafe static void SquarePtrParam(int* p) { *p *= *p; } unsafe static void ..