ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#]문법
    C#/기초 2022. 2. 18. 11:14

    이것이 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

    댓글

Designed by Tistory.