본문 바로가기
반응형

책/Effective C#32

Effective C# - Item19 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라 만약 어떤 알고리즘이 특정 타입에 대해 더 효율적으로 동작한다고 생각된다면 그냥 그 타입을 이용하도록 코드를 작성하자. 이를 위해 제약 조건을 설정하는 것은 항상 효과적인 방법은 아니다. 제네릭의 인스턴스화는 런타임의 타입을 고려하지 않으며 컴파일타임의 타입만을 고려한다. 효율적인 코드를 작성하려면 이러한 사실을 반드시 알고있어야 한다. 컴파일 타임(Compile Time) 컴파일러에 의해 소스코드에서 목적코드(기계어 또는 중간코드)로 변환되는 동안을 가리킨다. 컴파일 타임에는 코드의 구문분석, 타입검사, 최적화등이 이루어진다. 제네릭의 인스턴스화는 주로 컴파일 타임에 이루어진다. 코드가 실행되기 전에 컴파일러는 제네릭 코드를 실제 타입으로 변환하고 최적환한다. public class MyPiggy { .. 2023. 12. 10.
Effective C# - Item 18 반드시 필요한 제약 조건만 설정하라 타입 매개변수에 대한 제약 조건(Constraint)은 클래스가 작업을 올바르게 수행학 위해서 타입 매개변수로 전달할 수 있는 타입의 유형을 제한하는 방법이다. 개발자는 올바르게 작업을 수행하기 위한 최소한의 제약 조건만을 설정해야 한다. Where키워드 C#에서 제네릭 타입의 제약 조건은 Where키워드를 사용하여 설정된다. 아래 코드는 T가 IComparable인터페이스를 구현하도록 제약조건을 사용하는 예제이다. public class Example where T : IComparable { public int CompareValues(T value1, T value2) { return value1.CompareTo(value2); } } Example intExample = new Example().. 2023. 12. 5.
Effective C# - 제네릭타입, 닫힌 제네릭 타입, 열린 제네릭 타입, JLT Compiler, IL 제네릭 타입 하나 이상의 타입 매개변수를 가지는 클래스 또는 메서드이다. class Piggy 닫힌 제네릭 타입 구체적인 타입이 할당되지 않은 상태에서 사용된다. Piggy codePiggy = new Piggy(); 열린 제네릭 타입 일부의 타입 매개변수만 구체적인 타입이 정해서 사용된다. Piggy codePiggy = new Piggy(); 머신 코드 공유 참조 타입 데이터가 실제로 저장된 메모리 주소를 가리키는 참조를 사용한다. 객체의 인스턴스는 힙메모리에 저장되고 변수는 그 객체를 가리키는 참조를 갖는다. MyPiggy piggy1 = new MyPiggy(); MyPiggy piggy2 = piggy1; 제네릭 타입의 타입 매개변수로 참조 타입이 전달되면,컴파일러는 해당 제네릭 타입에 대한 일.. 2023. 12. 5.
Effective C# - Item 17 표준 Dispose패턴을 구현하라 .NET에서는 비관리 리소스를 System.Runtime.Interop.SafeHandel을 상송한 파생 클래스를 통해 표현하는데 이 클래스 또한 Dispose패턴을 완변하게 구현하고 있다. 파생 클래스는 다음 작업을 수행해야 한다. -파생 클래스가 고유의 리소스 정리 작업을 수행해야 한다면 베이스 클래스에서 정의한 가상 메서드를 재정의 한다. - 멤버 필드로 비관리 리소스를 포함하는 경우에만 finalizer추가해야 한다. - 베이스 클래스에서 정의하고 있는 가상 함수를 반드시 재호출 해야 한다. 비관리 리소스를 포함하고 있다면 무조건 finalizer를 구현해야 한다. IDisposable인터페이스는 단 하나의 메서드만을 가진다. public interface IDisposable { void Dis.. 2023. 12. 3.
Effective C# - Item 16 생성자 내에서는 절대로 가상 함수를 호출하지 말라 객체가 완전히 생성되기 이전에 가상 함수를 호출하면 이상 동작을 일으킨다. 어떤 타입이든 생성자가 수행을 완료할 때까지는 완전히 생성되었다고 할 수 없다. 따라서 생성자 내에서 가상 함수를 호출하면 예상 처럼 동작하지 않는다. class B { protected B() { VFunc(); } protected virtual void VFunc() { Console.WriteLine("VFunc in B"); } } class Derived : B { private readonly string msg = "Set by initailizer"; public Derived(string msg) { this.msg = msg; onsole.WriteLine("Program 출력 " + msg); } protec.. 2023. 12. 3.
Effective C# - Item 15 불필요한 객체를 만들지 말라 GC( Garbage Collection )는 사용자를 대신하여 사용하지 않는 객체를 효율적인 방식으로 제거한다. 하지만 이러한 작업이 아무리 효율적이라 하더라도 힙에서 새로운 객체를 생성하고 삭제하는 작업은 그러한 일을 전혀 하지 않는 것에 비한다면 상대적으로 많은 프로세서 시간을 사용하므로 성능 문제를 일으킬 수 있다. 따라서 GC가 과도하게 동작하지 않도록 주의 해야한다. 기술적으로 몇 가지만 유념하면 GC의 작업을 현저히 줄일 수 있다. GC 작업을 줄일 수 있는 방법 01 지역변수를 멤버 변수로 변경 모든 참조 타입의 객체는 지역변수라 하더라도 동적으로 메모리를 할당한다. 이렇게 할당된 객체는 이 객체를 참조하는 상위 객체가 삭제되면 가비지가 된다. 지역변수의 경우 그 변수를 선언한 메서드를 벗.. 2023. 12. 3.
반응형