C#
-
아이템 23: 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라C# 2021. 5. 27. 01:57
1. C#에서의 제약 조건 설정 - 언뜻 보면 C#에서 제약 조건을 설정하는 방법에는 한계가 많은 것처럼 보인다. - 베이스 클래스 타입이나 특정 인터페이스로 제약 조건을 설정 - class 타입이나 struct 타입으로 형태를 제한 - 매개변수가 없는 생성자를 가져야 한다는 조건 정도 설정 - 임의의 static 메서드를 반드시 구현해야 한다거나 매개변수를 취하는 생성자를 반드시 구현하도록 제약 조건을 설정할 수는 없다. - 제한적이지만 인터페이스를 통해서 제약 조건을 설정할 수는 있지만 추가적으로 해야 할 작업이 너무 많고 기본적인 구조도 해칠 수 있다. 2. 인터페이스를 이용한 메서드 제약 - 어떤 제네릭 클래스에 대해 타입 매개변수 T가 반드시 Add() 메서드를 가져야 한다는 제약 조건을 설정하..
-
아이템 19: 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라C# 2021. 5. 17. 00:52
1. 요약 - 타입에 대한 제약 조건을 거의 사용하지 않으면서도 타입 매개변수로 지정될 가능성이 있는 타입들의 고유한 특성을 고려하고 특화된 기능들을 최대한 활용하여 제네릭 타입을 만드는 방법 2. 제네릭 타입과 구체적인 타입의 관계 - 제네릭 타입의 경우 타입 매개변수에 새로운 타입을 지정하여 손쉽게 재사용 가능. - 코드를 덜 작성해도 되므로 유용하나 구체적인 타입이 주는 장점을 잃고 최적화한 알고리즘 사용 불가. - C#은 이 부분도 고려했으므로 만약 어떤 알고리즘이 특정 타입에 대해 더 효율적으로 동작한다고 생각된다면 그냥 그 타입을 이용하도록 코드를 작성하라. - 이를 위해 제약 조건을 설정하는 것이 항상 효과적인 방법은 아님. - 제네릭의 인스턴스화는 런타임의 타입을 고려하지 않고 컴파일 타임..
-
아이템 15 : 불필요한 객체를 만들지 말라C# 2021. 5. 9. 02:10
1. 요약 - 제목이 곧 내용 - GC가 메모리를 효율적으로 관리하지만 힙에서 객체 생성/제거는 여전히 시간 필요 - GC가 과도하게 동작하지 않도록 주의 2. 자주 사용되는 지역 변수를 멤버 변수로 변경 // Paint 이벤트 핸들러 내에서 GDI 객체를 할당하는 경우 protected override void OnPaint(PaintEventArgs e) { // 나쁜 예. Paint 이벤트가 발생할 때마다 동일한 폰트를 생성한다. using(Font MyFont = new Font("Arial", 10.0f)) { e.Graphics.DrawString(DateTime.Now.ToString(), MyFont, Brushes.Black, new PointF(0, 0)); } base.OnPaint(..
-
아이템 11 : .NET 리소스 관리에 대한 이해C# 2021. 5. 2. 18:54
1. .NET 환경에서는 메모리 관리와 가비지 수집기(Garbage Collector, GC)의 동작 방식 이해가 중요 2. 가비지 수집기 - 관리되는 메모리(managed memory)를 관장 - 메모리 누수, 댕글링 포인터(dangling pointer), 초기화되지 않는 포인터, 여타의 메모리 관리 문제를 자동화 - 순환 참조의 문제나 여러 객체들 간의 복잡한 연관 관계의 문제도 비교적 쉽게 구현 - 마크/콤팩트(Mark/Compact) 알고리즘 : 여러 객체 사이의 연관 관계를 효율적으로 파악하여 더 이상 사용되지 않는 객체 자동 제거 3. 여전히 개발자가 직접 관리해야 하는 비관리 리소스 - 데이터베이스 연결 - GDI+ 객체 - COM 객체 - 시스템 객체 4. 가비지 수집기가 수행되면 관리 ..
-
아이템 7 : 델리게이트를 이용하여 콜백을 표현하라C# 2021. 5. 1. 01:09
1. 델리게이트? (Delegate, 대리자) - 타입 안정적인 콜백 정의 가능 - 여러 클래스가 상호 통신을 수행해야 할 때 사용하면 클래스 간의 결합도 낮춤 - 런타임에 통지 대상 설정 가능하며, 다수의 클라이언트에게 통지 가능 (여러 메서드 참조 가능하므로) - 콜백과 델리게이트는 C#이 제공하는 관용구의 하나 - 람다 표현식을 사용하는 경우에도 널리 활용 1.1 델리게이트의 사용 예 // 델리게이트 선언 delegate int MyDelegate(int a, int b); public void DelegateTest() { // 델리게이트 인스턴스 생성 MyDelegate sumDelegate = new MyDelegate(PlusMethod); // 호출 int sum = sumDelegate(..
-
아이템 3 : 캐스트보다는 is, as가 좋다C# 2021. 4. 29. 00:58
1. 요약 - 가능하면 형변환은 피하는게 좋다. - 불가피하게 필요하다면 as가 더 안전하고 효율적이면서 명확하다. - 형변환에 다양한 방법이 있지만 그 각각이 서로 다르게 동작함을 유념하자. 2. C#에서 형변환 방법 as 연산자 캐스트 연산자 t = st as MyType; t = (MyType)st; 3. as 연산자의 장단점 장점 단점 캐스팅보다 안전 런타임에 더 효율적으로 동작 사용자 정의 형변환은 수행되지 않음 4. 예시 코드 object o = Factory.GetObject(); // 첫번째 버전 MyType t = o as MyType; // o가 어떤 타입으로 선언되었든 항상 동일한 결과 반환 if(t != null) { // MyType 타입의 t 객체 사용 } else { // 오류..