-
이것이 C#이다. 책 참조.
4.7 조건 연산자
?:
조건식 ? 참일_떄의_값 : 거짓일_때의_값
ex)
int a =30; string result = a == 30 ? "삼십" : "삼십아님"; // result는 삼십
4.8 null 조건부 연산자
( null이 아니면~~ ?. 실행)
null 조건부 연산자 ?. (C#6.0도입)
?. //해당 객체가 null인지 검사하여 그 결과가 참(즉, 객체가 null)이면 그 결과로 null을 반환하고,
그렇지 않은 경우에는 . 뒤에 지정된 멤버를 반환.
ex)
class Foo { public int member; } Foo foo = null; int? bar; bar = foo?.member; //foo객체가 null이 아니면 member필드에 접근하게 해줌.
4.11 null 병합 연산자
( null 이면~~ ?? 실행)
?? 연산자는 두 개의 피연산자를 받아들이고 왼쪽 피연산자가 null인지 평가합니다.
null이 아닌 것으로 나타나면 왼쪽 피연산자를 그대로 반환하고,
null인 것으로 평가되면 오른쪽 피연산자를 반환.
ex)
int? a = null; Console.WriteLine($"{a ?? 0}"); //a는 null이므로 0이 출력. a == 99; Console.WriteLine($"{a ?? 0}"); //a는 null이 아니므로 99가 출력.
7.8 상속으로 코드 재활용하기
파생 클래스의 생성자에서 기반 클래스의 생성자로 매개변수를 넘겨주는 방법.
class Base { protected string name; public Base(string name) { this.name = name; } } class Derived : Base { public Derived(string name) : base(name) //Derived 생성자 매개변수 name을 base 생성자 매개변수로 전달 { Console.WriteLine("{0}.Derived()", this.name); // this.name은 class Base를 상속해서 가지는 name. } }
13.1 대리자란?
한정자 delegate 반환_형식 대리자_이름( 매개변수_목록 );
ex)
using System; namespcae Delegate { delegate int MyDelegate( int a, int b ); class Calculator { public int Plus(int a, int b) { return a + b;} public static int Minus(int a, int b) { return a - b;} } class MainApp { static void Main(string[] args) { Calculator Calc = new Calculator(); MyDelegate Callback; Callback = new MyDelegate( calc.Plus ); //대리자 인스턴스 생성. Console.WriteLine( Callback(3, 4) ); // 7 출력. Callback = new MyDelegate( Calculator.Minus ); // 정적메소드참조하는 대리자 인스턴스 생성. Console.WriteLine( Callback(7,5) ); // 2출력. } } }
13.3 일반화 대리자
delegate int Compare<T>(T a, T b);
13.4 대리자 체인
- 대리자 하나가 여러 개의 메소드를 동시에 참조할 수 있다.
delegate void ThereIsAFire( string location ); void Call_119( string location ) { Console.WriteLine("소방서죠? 불났어요! 주소는 {0}", location); } void ShortOut( string location ) { Console.WriteLine("피하세요!{0}에 불이 났어요!"); } void Escape( string location ) { Console.WriteLine("{0}에서 나갑시다!"); } ThereIsAFire Fire = new ThereIsAFire ( Call119 ); Fire += new ThereIsAFire (ShotOut); Fire += new ThereIsAFire (Escape); Fire("우리집"); // 소방서죠? 불났어요! 주소는 우리집 // 피하세요! 우리집에 불이 났어요! // 우리집에서 나갑시다!
13.6 이벤트: 객체에 일어난 사건 알리기
using System; namespace EventTest { delegate void EventHandler(string message); // EventHandler 대리자 선언, class 내,외부 선언가능. class MyNotifier { public event EventHandler SomethingHappened; // event 한정자로 EventHandler인스턴스 변수 선언. // 이벤트 핸들러 이름 == 대리자 이름 // 이벤트 선언: 대리자에 event한정자로 수식해서 선언 // 이벤트 핸들러 인스턴스 변수에 += new 대리자이름(메소드); 로 이벤트 등록 public void DoSomething(int number) { int temp = number % 10; if( temp != 0 && temp % 3 == 0 ) { SomethingHappened(String.Format("{0} : 짝", number)); // event호출. // 이벤트는 public한정자로 선언돼 있어도 자신이 선언된 클래스 외부에서는 호출이 불가능. // 이벤트등록은 외부 클래스에서 가능. // 외부클래스에서 이벤트를 등록하고 이벤트 선언한 클래스에서 호출. } } } class MainApp { static public void MyHandler(string message) { Console.WriteLine(message); } static void Main(string[] args) { MyNotifier notifier = new MyNotifier(); notifier.SomethingHappened += new EventHandler(MyHandler); // notifier class인스턴스의 SomethingHappened라는 EventHandler event인스턴스 변수에 // MyHandler메소드를 대리자로하는 EventHandler event인스턴스생성.(이벤트 등록) // 외부 클래스에서 이벤트등록 가능. for( int i=1; i<30; i++) { notifier.DoSomething(i); } } } }
13.7 대리자와 이벤트
- 이벤트는 public한정자로 선언돼 있어도 자신이 선언된 클래스 외부에서는 호출이 불가능.
- 대리자는 public이나 internal로 수식되어 있으면 클래스 외부에서라도 얼마든지 호출가능.
- 이벤트 선언시 대리자는 클래스 내,외부 둘다 선언가능.
- 클래스 외부에서는 이벤트 등록 가능.( 대리자는 선언과 호출이 class 외부에서도 가능하기 떄문.)
- 클래스 외부에서 이벤트 등록하고 이벤트 선언한 클래스 내부에서 이벤트 호출하여 사용.
event한정자로 대리자를 수식하여 class내부에서만 호출가능한 이벤트 핸들러 인스턴스 선언.
class외부에서 호출가능한 대리자로 이벤트 등록(생성). ex) += new EventHandler(메소드);
event선언한 class에서 호출하여 사용.
728x90'C# > 기초' 카테고리의 다른 글
[C#]Resources.resx 열기 (0) 2022.02.25 [C#]LINQ (0) 2022.02.21 WritePixels (0) 2021.12.24 [C#]WPF Serial Port (0) 2021.12.21 [C#] ??, ?. 연산자 ( Nullable) Null 널 (0) 2021.12.16 댓글