프로그래밍/(도서)C#코딩의기술-실전 23

[C#] 코딩의기술(실전편) - 그 외, 챕터 별 간단 정리

1.8 주석 주석에는 아무거나 작성할 수 있습니다. 컴파일 시 오류가 발생하지 않습니다. 주석은 코드가 의미하는 바를 함축적으로 담고 있는 내용입니다. 코드와 다른 내용의 주석이 존재할 수 있으니 관리를 해야합니다. 2.1 루프 루프에서는 시작 조건과 종료 조건에 버그가 발생하기 쉽습니다. 예제에서 i 값을 0과 1을 잘못 적거나 부등호에 등호(=)를 포함 여부에 따라 버그가 발생할 수 있습니다. 컬렉션을 다루는 경우 foreach문을 사용하거나 컬렉션을 다루는 명령, API를 적극적으로 사용해야 합니다. 예제* for (int i = 0; i < 10; i++) { Console.WriteLine($"{i}"); } 예외 발생 2.4 서식변경 과 중괄호 코드 작성 시 명시적으로 그리고 일관성 있게 코드..

[C#] 코딩의기술(실전편) - 4.1 var VS object VS dynamic

var 어떠한 타입이라도 변수로 선언하여 사용할 수 있습니다. var 형식은 최초 초기화되어 타입이 정해진 이후에는 타입을 변경할 수 없습니다. null로는 초기화 할 수 없습니다. 선언 시점에 특정 타입으로 초기화 되어야 합니다. var 타입은 선언 시점에서 타입을 추정하기 때문에 인텔리센스가 완벽하게 지원 됩니다. var 인텔리센스 데이터형의 속성 확인이 가능합니다. object 어떠한 타입이라도 변수로 선언하여 사용할 수 있습니다. 값 형식 -> 참조형식, 참조형식 -> 값 형식으로 형 변환을 할 경우 박싱(boxing : 값형식 -> 참조형식), 언박싱(unboxing : 참조형식 -> 값형식) 과정이 일어나며, 성능상 영향을 미칠 수 있습니다. object 인텔리센스 데이터형의 속성 확인이 불가..

[C#] 코딩의기술(실전편) - 3.13 열거 데이터의 순서 변경

1. 열거 데이터 삭제 열거 데이터에서 삭제를 하는 경우 예외가 발생합니다. 요소의 개수가 변경이 되는 경우 예외가 발생합니다. static void Main(string[] args) { var list = new List { 1, 2, 3, }; foreach (var item in list.Where(c=>c>1)) { list.Remove(item); } } 2. 열거 데이터 변경 열거 객체가 변하지 않고 객체 안에 있는 내용만 달라지는 것은 상관없습니다. Where 메서드는 내용을 먼저 읽지 않습니다. 중간에 값이 바뀌더라도 예외 발생하지 않습니다. static void Main(string[] args) { int[] array = { 1, 2, 3}; foreach (var item in a..

[C#] 코딩의기술(실전편) - 3.12 First메서드 VS Take메서드

1. First메서드 와 Take메서드 First() : 1번째 요소를 가져오는 메서드 Take(n) : n 번째 요소를 포함한 시퀀스(sequence)를 가져오는 메서드 2.First메서드와 Take메서드 차이점 First메서드는 1번째 값을 가져오므로, 나중에 배열의 값을 변경해도 결과는 그대로입니다. 예제에서 numbers.First()를 호출하는 순간 1번째 값을 가져옵니다. Take메서드는 1번째 값과 시퀀스를 가져옵니다. 예제에서 numbers.Take(1)을 호출하는 순간 1번째 값을 가져올 수 있는 권한과 시퀀스를 가져옵니다. 실제로 값을 가져오는 건 ElementAt() 입니다. ElementAt()호출 전에 배열 값의 변경이 이루어져서 변경된 값이 출력됩니다. 2.1 사용예제 class..

[C#] 코딩의기술(실전편) - 3.7 Cast VS OfType

1. Cast 메서드 컬렉션의 형을 변환해주는 메서드입니다. 하지만 Cast메서드를 사용해도 형이 맞지 않을 때, 예외가 발생합니다. static void Example_Cast() { object[] arr = { 1, 2, 3,"test" }; var q = arr.Cast(); Console.WriteLine($"q의 합계 :{q.Sum()}"); } 1.1 Cast() 사용예제 1.2 실행 결과 배열에 string문자열을 int형으로 변환 하려해서 예외 발생합니다. 2. OfType메서드 컬렉션의 형을 변환해주는 메서드입니다. 변환할 수 없는 요소는 무시하는 LINQ 메서드입니다. 예외 발생하지 않습니다. 2.1 OfType() 사용 예제 static void Example_OfType() { o..

[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 ..