C# 75

[GoF]추상 팩토리 패턴(Abstract Factory Pattern)

1.정의 -호환성이 있는 개체군을 하나의 팩토리 개체를 통해 생성하게 함으로써 사용자의 편의성을 증대시킬 수 있는 패턴. 2.시나리오 1)EH world회사에서 생산하는 카메라에는 E카메라와 H카메라가 존재 2)일상에서는 E카메라가 선호 3)여행에서는 H카메라를 선호 4) E카메라는 E렌즈와 호환되고 H카메라는 H렌즈와 호환 =>문제사항 -카메라와 호환성 있는 렌즈를 찾는데(렌즈 중 H렌즈 와 E렌즈를 구분 및 검사)비용이 발생 5)E박스와 H박스에 따라 렌즈와 카메라를 보관함으로써 해결. => 여기서 박스가 팩토리 객체가 된다. 3.다이어 그램 -Camera 클래스와 Lens 클래스에 파생되는 클래스로 Ev와 Hv가 존재 - Lens 클래스는 Take()메서드를 구현. -Camera 클래스는 PulnL..

아이템16.생성자 내에서는 절대로 가상함수를 호출하지 마라.

-객체를 완전히 생성하기전에 가상함수(virtual)를 호출하면 이상동작을 일으킨다. -어떤 타입이든 생성자가 작업을 완료할떄까지 객체가 완전히 생성되었다고 볼 수 없다. -class B는 생성자를 호출 할때 가상함수 VFunc를 호출한다. -class B를 상속 받는 Derived 클래스는 생성자가 호출될 때 msg를 쓰는 메서드를 호출한다. -Vfunc는 오버라이드 되어 런타임에 재정의한 함수가 발동한다. -msg 변수는 'Set by intializer'를 기본이고 main 객체가 만들어질 때는 'Constructed in main'를 쓰도록 작성되있다. -그렇지만 쓰여지는 것은 'Set by intializer'이다. -C#에서 생성자의 본문으로 진입하는 순간 해당 객체는 이미 초기화가 완료되었다..

C#/이펙티브 C# 2023.07.20

아이템15.불필요한 객체를 만들지 마라

1.가비지 컬렉터 -가비지 컬렉터는 사용자를 대신하여 메모리를 관리하여 사용하지 않는 객체를 제거한다. -가비지 컬렉터 효율적이라도 힙에 새로운 객체를 생성*삭제는 과정은 꽤 적지않는 비용을 소비한다. -기술적으로 몇가지만 고려하면 가비지 컬렉터의 작업을 현저히 줄일 수 있다. 2.지역변수 내의 객체 생성 자제하고 지역변수는 멤버로 선언하자. -위의 메서드가 호출 될 때마다 Font 의 객체를 만든다. -위의 메서드는 Font를 멤버변수로 만들어 재사용하도록 개선했다. -메서드 내의 객체를 생성한다면 멤버변수로 만들어 가비지를 줄일 수 있다. 3.자주 사용되는 참조타입을 정적변수로 만들자. -위 코드는 Brush.Black은 정적 속성으로 만들고 Brush.Black를 호출 할떄 객체가 생성함으로써 가비..

C#/이펙티브 C# 2023.07.19

아이템 13. 정적 클래스 멤버를 올바르게 초기화하라.

1.정적(static) 클래스 -한정자를 사용하여 특정 개체가 아니라 형식 자체에 속하는 정적 멤버를 선언할 수 있다. -정적 멤버변수를 포함하는 타입이 있으면 인스턴스를 생성하기 전에 정적 멤버 변수를 초기화 해야한다. -C# 에서는 정적 멤버 초기화구문과 정적 생성자 두 가지 기능을 제공. 2.정적멤버 초기화 -정적 멤버 선언 시 초기화를 하는 것. 일반 멤버처럼 초기화. -정적 생성자보다 이전에 실행되며 베이스 클래스의 정적생성자가 있다 해도 보다 먼저 실행된다. 3.정적 생성자 -타입내에 정의된 모든 메서드,변수,속성에 최초로 접근하기 전에 자동으로 호출 되는 메서드. -정적변수 초기화, 싱글턴 패턴을 작성할 수 있다. -정적멤버 초기화에서 예외가 발생되면 TypelnitializationExce..

C#/이펙티브 C# 2023.07.05

아이템12. 할당 구문보다 멤버 초기화 구문이 좋다.

1.할당 구문 -선언하고 본문에 초기화 하는것. 2.멤버 초기화 구문 -선언과 동시에 초기화 하는것. 3.초기화 구문의 장점 -가독성이 좋다. -변수 초기화 누락을 방지한다. 4.멤버 초기화를 하지 말아야 하는 경우 1)0이나 null 값으로 초기화 할 때 -두 개의 변수 모두 0으로 초기화 한다. -myval1은 변수 모두에 대해서 0으로 설정한다. -myval2은 initobj라는 IL명령을 수행하는데 추가시간이 소요된다. -0으로 초기화를 할 경우 첫번째 구문이 낫다. *initobj:지정된 주소에서 값 형식의 각 필드를 null 참조 또는 적절한 기본 형식의 0으로 초기화합니다. 2)객체를 반복해서 초기화하는 경우 -labels은 본문의 객체만 남고 먼저 선언되었던 초기확 구문은 가비지가 된다. ..

C#/이펙티브 C# 2023.07.03

아이템11. NET 리소스 관리에 대한 이해

1.가비지 컬렉터 -C#에서 제공하는 메모리 관리 시스템 -더 이상 사용하지 않는 객체(접근 불가능한)를 메모리에서 자동으로 해제 시켜주는 기능. - 메모리 신경을 덜 쓸 수 있어 프로그램 구조가 단순해진다. 2.콤팩트 작업 -사용 중인(혹인 도달 가능한) 객체들을 한쪽으로 차곡차곡 옮겨서 조각난 메모리를 큰 메모리로 만드는 일. 3.finalizer(종료자) -가비지컬렉터가 있다고 하지만 데이터베이스연결,GDI+객체,COM객체,시스템객체는 비 관리 소스는 개발자가 직접 관리 해야 한다. -그래서 C#은 메모리 관리에 필요한 finalizer 및 IDisposable 인터페이스를 제공한다. 1)finalizer(종료자) -하지만 종료자는 많은 단점을 가진다. -종료자가 사용됐지만 우리가 원하는 시점에 객..

C#/이펙티브 C# 2023.07.02

아이템9.박싱과 언박싱을 최소화하라.

C#이 사용하는 메모리 형식 1.값 형식(value) -메모리에 값을 담는 형식 -스택에 할당 -기본데이터 형식과 구조체가 해당 2.참조(Referce) 형식 -메모리에 다른 변수의 주소를 담음 -힙에 할당(가비지컬렉터가 자동으로 제거) -복합데이터 형식과 클래스가 여기에 해당 데이터 형식 1.object 형식 -상속으로 어떤 데이터든 다룰 수있는 형식 -C#은 모든 데이터형식이 object형식을 받을 수 있도록 되어 있다. -모든 데이터형식은 object 타입의 자식이다. -박싱: 값 형식을 object 형식에 담아 형식 힙에 올리는 것 -언박싱 : 힙에 올라간 데이터를 object에 꺼내 값 형식으로 옮기는것. - 박싱과 언박싱을 수행하는 과정에서 복사가 일어나 임시 객체가 생성되기도 하며, 객체를 ..

C#/이펙티브 C# 2023.06.30

아이템8.이벤트 호출 시에는 null 조건 연산자를 사용하라.

1.이벤트(Event) -C#에서 객체의 사건을 표현하는 방식 -이벤트 처리기(Event Handler): 이벤트 발생 시 실행되는 메소드 -외부에서 호출 불가(은닉성) 2.null 조건 연산자 (C# 6.0에 추가됨) -객체의 맴버에 접근 하기 전에 해당 객체가 null인지 검사하는 형식 -객체가 null 이면 null을 반환 그렇지 않으면 지정된 멤버를 반환 3.예제 -이벤트를 호출 할 때 이벤트 핸들러에 등록된 정보가 없다면 nullreference를 띄운다. -그래서 if문으로 null값을 검사한다. -하지만 이렇게 되면 멀티스레드 환경해서 문제가 생긴다. -다른 스레드 환경에서에서 이벤트를 취소하게 된다면 nullreference를 띄우게 된다. -위 코드는 멀티스레드 환경에서의 문제를 해결한 ..

C#/이펙티브 C# 2023.06.29

아이템7. 델리게이트를 이용하여 콜백을 표현하라.

1.콜백 1)정의: -피호출자가 호출자를 다시 호출하는 것. -다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 2.델리게이트(대리자) 1)정의 -코드(메소드)를 대신 실행하는 객체 -메소드를 호출하듯 사용(즉, 인수를 입력하고 결과를 반환받음) -단, 대리자가 실행할 코드는 컴파일이 아닌 실행 시점에 결정 2)Func과 Action Func과 Action은 마이크로소프트가 미리 선언해둔 대리자이다. -Func은 결과를 반환하는 메소드 (반환값 있음) -Action은 결과를 반환하지 않는 메소드 (반환값 없음) 3)델리게이트의 장점 -타입 안정적인 콜백을 정의할 수 있다. -인터페이스보다 결합도를 낮출 수 있다. -런타임에 설정할 수 있고 다수의 클라이언트에 보낼 수 있다. 4)주의점 -델리게이..

C#/이펙티브 C# 2023.06.25