2018/06 32

[Effective C#] 박싱과 언박싱을 최소화하라

[Effective C#] 박싱과 언박싱을 최소화하라.NET Framework에서는 모든 타입의 최상위 타입을 참조타입인 System.Object로 정의하고 있다.object는 참조형식이 때문에 힙에 데이터를 할당한다.반면, int나 double은 값 형식이기 때문에 스택에 데이터를 할당하며, 다형적이지 못하다.이 두가지는 양립하는 것 처럼 보이지만 앞서 모든 타입의 최상위 타입은 참조형식인 System.Object를 상속받는다고 했다. 어떻게 그럴 수 있을까?.NET Framework에서는 박싱(Boxing)과 언박싱(Unboxing)이라는 방법을 통해 이 두가지 서로 다른 타입을 이어준다.int firstParam = 5; int secondParam = 10; int thirdParam = 15; ..

아카이빙/C# 2018.06.30

[Effective C#] string.Format()을 보간 문자열로 대체하라

[Effective C#] string.Format()을 보간 문자열로 대체하라C# 6.0에는 보간문자열(Interpolated string)이라는 새로운 기능이 도입되었다.보간문자열이 뭘까? 예시로 살펴보자int a = 5; int b = 13; string str1, str2; ​ // 이랬던 것을 str1 = string.Format("{0} + {1} = {2}", a, b, a + b); Console.WriteLine(str1); ​ // 이렇게 바꾼다 str2 = $"{a} + {b} = {a + b}"; Console.WriteLine(str2);string.Format() 은 직접 출력해보고 눈으로 확인하기 전까지는 코드를 제대로 작성했는지 쉽게 짐작하기 어려운 반면, 보간 문자열은 포맷..

아카이빙/C# 2018.06.30

[CleanCode] 의미있는 이름

[CleanCode] 의미있는 이름의도가 분명히 밝혀라int d; // 경과시간 (단위 : 날짜)이름 d에는 아무 의미도 드러나지 않는다.int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays;경과 시간이나 날짜라는 느낌을 표현하는 이름이 필요하다 그릇된 정보를 피하라오해를 불러 일으키는 코드는 피하자여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면, accountList라는 명명을 하지 말자.accountGroup, bunchOfAccounts, Accounts 등이 적절하다.서로 비슷한 두 이름을 사용하는 것도 좋지 않다.XYZControllerForEfficientHandlingOfSt..

[C#] LINQ

[C#] LINQLINQ는 데이터 작업에 특화된 C#의 기능이다.LINQ (Language INtegrated Query)의 약어. C#언어에 통합된 데이터 질의(query) 기능쿼리는 기본 적으로 다음과 같은 내용을 포함From : 어떤 데이터 집합에서 찾을 것인가?Where : 어떤 값의 데이터를 찾을 것인가?Select : 어떤 항목을 추출할 것 인가?LINQ 예제예를 들어보자.다음과 같이 키와 이름을 필드로 갖는 Profile 클래스가 있다.class Profile { public string Name {get; set;} public int Height {get; set;} ​ public Profile(string name, int height) { this.Name = name; this.H..

아카이빙/C# 2018.06.26

[C#] 람다식 (Lambda Expression)

[C#] 람다식 (Lambda Expression)람다식은 익명 메소드를 만드는 하나의 방법이다. (또 다른 방법은 delegate를 이용)보다 분명하고 간결한 방법으로 함수를 묘사하기 위함기본 람다식의 형식delegate int Del(int a, int b); static void Main() { //매개변수목록 => 식 Del d1 = (int a, int b) => a + b; Console.WriteLine(d1(5, 8)); ​ //형식 유추(Type Inference) Del d2 = (a, b) => a + b; Console.WriteLine(d2(5, 8)); }문 형식의 람다식 (Statement Lambda)delegate void DoSomething(); static void M..

아카이빙/C# 2018.06.26

[C#] 이벤트와 델리게이트

[C#] 이벤트와 델리게이트이벤트를 선언하고 사용하는 절차는 다음과 같다.1. 델리게이트를 선언delegate void EventHandler(string msg);2. 선언한 델리게이트의 인스턴스를 event 한정자로 선언class Notifier { public event EventHandler SomethingHappened; public void DoSomething(int num) { int temp = num % 10; ​ if (temp != 0 && temp % 3 == 0) { SomethingHappened(String.Format("{0} : 짝", num)); } } }3. 이벤트 핸들러 작성. 1에서 선언한 델리게이트와 일치하는 메소드면 가능class MainApp { public..

아카이빙/C# 2018.06.25

[C#] Delegate와 익명메소드

[C#] Delegate와 익명메소드익명 메소드란 이름이 없는 메소드다.한 번 사용하고 다시 사용할 일이 없을 것 같다면 익명메소드를 사용하는 게 편하다.Delegate 선언delegate int Calculate(int a, int b);메인static void Main() { Calculate calc1, calc2; calc1 = delegate (int x, int y){return x + y;}; calc2 = (x, y) => {return x - y;}; ​ Console.WriteLine(calc1(5, 6)); Console.WriteLine(calc2(5, 6)); }11 -1calc1(더하기)을 더욱 간단히 구현한게 calc2(빼기) 이다. calc2 와 같은 방식은 람다식이라고 부르..

아카이빙/C# 2018.06.25

[C#] Delegate는 언제 사용하는가

[C#] Delegate는 언제 사용하는가대표적으로 메소드를 매개변수로 넘기고 싶을때정렬 시, 비교 루틴을 매개변수로 넣어보자.Delegate 선언delegate int Compare(T a, T b);오름차순, 내림차순 메소드static int AscendCompare(T a, T b) where T : IComparable { return a.CompareTo(b); } ​ static int DescendCompare(T a, T b) where T : IComparable { return a.CompareTo(b) * -1; }Compare delegate를 매개변수로 받는 정렬 메소드static void BubbleSort(T[] dataSet, Compare Comparer) { T temp;..

아카이빙/C# 2018.06.25

[C#] Delegate (대리자)

[C#] Delegate (대리자)Delegate란?특정 매개변수들이나 반환형식이 있는 메소드에 대한 참조를 나타내는 형식 (C/C++의 함수 포인터)Delegate를 인스턴스화하면 모든 메소드가 있는 인스턴스를 호환되는 반환형식에 연결할 수 있으며, Delegate의 인스턴스를 통해 메소드를 호출 할 수 있다.메소드를 다른 메소드에 인수로 전달하는 데에 사용된다.콜백 메소드를 정의할 수 있다.사용 예class MainApp { //string을 인수로 받고, void를 반환하는 delegate 선언 public delegate void Del(string message); ​ public static void DelegateMethod(string message) { Console.WriteLine("..

아카이빙/C# 2018.06.25