본문 바로가기
반응형

책/Effective C#32

Effective C# - Item14 초기화 코드가 중복되는 것을 최소화하라 C# 컴파일러는 공용 생성자를 이용하는 초기화 방식을 매우 특별한 문법으로 인식한다. 변수에 대한 중복 초기화 코드를 제거해줄 뿐 아니라 베이스 클래스의 생성자가 반복적으로 호출되는 것도 막아준다. 즉 객체 초기화를 위해 수행해야 하는 코드를 최적화해준다. 개발자 입장에서는 초기화 과정 일부를 공용 생성자에 위임할 수 있으므로 작성하는 코드의 양을 최소활 할 수 있다. 1. Constructor Chaining 여러 생성자 중에서 가장 많은 입력을 필요로 하는 생성자를 기준으로 하여, 입력할 값의 수가 적은 다른 생성자들을 이 기준이 되는 생성자를 통해 간접적으로 호출하는 기법이다. 이를 통해 코드의 중복을 최소화하고 재사용성을 높일 수 있다. Unity - Constructor Chaining(생성자 .. 2023. 12. 3.
Effective C# - Item13 정적 클래스 멤버를 올바르게 초기화하라 정적 멤버 변수를 포함하는 타입이 있다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화 해야한다. C#에서는 정적 멤버 초기화 구문과 정적 생성자라는 두 가지 기능을 제공한다. 예시 static MyClass()는 정적 생성자이며 클래스가 처음으로 사용될 때 한 번만 호출된다. 이를 통해 정적 멤버 변수 myPiggy를 초기화 할 수 있다. public class MyClass { // 정적 멤버 변수 public static int myPiggy; // 정적 멤버 초기화 구문 static MyClass() { myPiggy = 42; } } 정적 생성자를 사용하는 대표적 사례 : 싱글톤 패턴 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴 중 하나이다. 정적 생성자를 사용하여 구현할 때 정.. 2023. 12. 1.
Effective C# - Item12 할당 구문보다 멤버 초기화 구문이 좋다 클래스를 만들다보면 종종 둘 이상의 생성자를 작성해야 하는 경우가 있다. 그러면 자칫 초기화 코드를 누락하는 경우가 있는데 이러한 오류를 범하지 않으려면 생성자의 본문에서 멤버 변수에 값을 할당하기보다 멤버 초기화 구문을 사용하는 것이 좋다. 멤버 초기화 구문 생성자에게 멤버 변수에 값을 할당하는 대신에 해당 변수를 선언하는 동시에 초기값을 설정하는 방법이다. 01 멤버 초기화 구문의 사용 public class MyClass { //컬렉션을 선언하는 동시에 초기화 private List labels = new List(); } 02 멤버 초기화 구문과 생성자 멤버 초기화 구문에서 변수를 초기화하면 생성자 본문에서 해당 변수를 초기화할 필요가 없다. 멤버 초기화 구문이 생성자보다 먼저 실행되므로 생성자에.. 2023. 11. 30.
Effective C# - Item11 .NET 리소스 관리에 대한 이해 .NET 개발자가 되기 위해서는 관리 환경에서 메모리와 주요 리소스들이 어떻게 관리되는지를 올바르게 이해해야 한다. 특히 메모리 관리와 가비지 컬렉션의 동장 방식을 정확이 이해해야 한다. 가비지 컬렉션(GC)과 메모리 관리 가비지 컬렉션은 관리되는 메모리(managed memory)를 관리하는 기술로, 메모리 누수, 댕글링 포인터, 초기화되지 않는 포인터 등과 같은 메모리 관리 문제를 자동으로 처리한다. .NET 프레임워크에서는 가비지 컬렉터가 주기적으로 실행되어 더 이상 사용되지 않는 객체를 찾아내고 메모리에서 제거한다 마크/콤팩트(Mark/Compact) 알고리즘 여러 객체 사이의 연관 관계를 효율적으로 파악하여 더 이상 사용하지 않는 객체를 자동으로 제거한다. 마킹(Marking) 이 알고리즘의 첫.. 2023. 11. 29.
Effective C# - Item10 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라 베이스 클래스에서 virtual로 선언하지 않은 멤버를 재정의하려는 경우 new 한정자를 사용할 수 있다. 하지만 사용할 수 있다는 것은 전혀 다른 이야기이다. 왜냐하면 virutal로 선언되지 않은 메서드를 재정의하면 메서드의 동작 방식을 모호하게 만들 우려가 있기 때문이다. new한정자를 활용해도 좋은 경우는 베이스 클래스에서 이미 사용하고 있는 메서드를 재정의하여 완전히 새로운 베이스 클래스를 만들어야하는 정도이다. 이미 널리 사용되고있는 메서드가 있어서 이를 사용하는 코드를 일일이 찾아서 수정하기 어렵거나 혹은 외부 어셈블리에서 이 메서드를 사용하고 있어서 코드를 수정할 수 없는 경우라면 new한정자를 사용해볼 만하다. 코드 예시 public class BasePiggy { public void .. 2023. 11. 22.
Effective C# - Item9 박싱과 언박싱을 최소화하 박싱(Boxing) 값 타입의 객체를 타입이 정해져 있지 않은 임의의 참조 타입 내부에 포함시키는 방법이다. 이를 이용하면 참조 타입이 필요한 경우에도 값 타입을 쓸 수 있다. int intValue = 42; object boxedValue = intValue; // 박싱 언박싱(UnBoxing) 박싱되어 있는 참조 타입의 객체로부터 값 타입 객체의 복사본을 가져오는 방법이다. object boxedValue = 42; int intValue = (int)boxedValue; // 언박싱 박싱 언박싱을 수행하는 과정에서 임시 객체가 생성되기도 하는데 간혹 이로 인해 예상치 못한 버그가 발생하기도 한다. 박싱은 값타입을 참조 타입으로 변경한다. 이 과정에서 새롭게 생성된 참조 타입의 객체는 힙에 생성되며.. 2023. 11. 22.
반응형