ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 3교시...
    @ 16. 1 ~ 17. 1/C# 2014. 7. 27. 22:25

    확장 메소드..

    기존 클래스의 기능을 확장하는 기법인데..이게 상속과는 다르다 이거야..

    기존 클래스의 기능을 확장하는것이다..

    확장 메소드를 선언하는 방법은 메소드를 선언하되 1. static 한정자로 수식해야하고..

    그리고 2. 첫 번째 매개변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스의 인스턴스여야 합니다.

    3. 그 뒤에 따라오는 매개변수 목록이 실제로 확장 메소드를 호출할 때 입력되는 매개변수이다.

    using A;
    using B;

    namespace A
    {
        public class aa
        {
            public void data()
            {
                Console.WriteLine("A클래스");
            }
        }
    }

    namespace B
    {
        public static class bb
        {
            public static void Show(this aa a, int b)
            {
                Console.WriteLine("{0}",b);
            }
        }
    }

    namespace ConsoleApplication3
    {
        class Program
        {
            [DllImport("msvcrt")]
            static extern int _getch();

            static void Main(string[] args)
            {
                aa a=new aa();
                int d=3;
                a.Show(d);
                _getch();
               
            }
        }
    }
    A클래스의 기능을 확장하여 a.show가 된다..진한글씨가 핵심이다.

     


    클래스와 구조체의 차이점

     

    특징 

    클래스 

    구조체 

    키워드 

    class 

    struct 

    형식 

    참조형식 

    값형식 

    복사 

    얕은 복사 

    깊은복사 

    인스턴스 생성 

    new 연산자와 생성자 필요 

    선언만으로도 생성 

    생성자 

    매개변수 없는 생성자 선언 가능 

    매개변수 없는 생성자 선언 불가능 

    상속 

    가능 

    모든 구조체는 system.object형식을 상속하는 system.valuetype으로부터 직접 상속받음 

    ....

    C++에서는 클래스에서도 선언만으로 생성가능했는데..C#에선 구조체밖에 안되고..클래스는 참조란다..

    (물론 생성자를 이용한 인스턴스 생성도 구조체에서 가능하다..클래스 생성방법처럼..)

    그리고 매개변수 없는 생성자 선언 불가능이라는..

     


    인터페이스란..?

    interface 인터페이스 이름

    {   

    함수 //선언

    함수 //선언

    }

    응? 클래스랑 비슷하잖아?

    아니다..인터페이스는 메소드 이벤트 인덱서 프로퍼티만 가지는데..정의부분도 없다..선언이 끝..

    접근 제한 한정자가..기본적으로 public이다..(C++에서 구조체와 같은..반대로 class는 기본이 private)

    그리고 인스턴스도 못만듬..

    그럼 이걸 어따쓰냐?

    비록 인터페이스는 인스턴스를 못가지지만..이 인터페이스를 상속받는 클래스의 인스턴스를 만드는것은 가능함!

    근데 규칙이 있음.

    1. 인터페이스를 상속받는 자식클래스는 선언되어 있는 모든 메소드를 구현해 줘야 한다..

    2. 이 메소드는 public 한정자로 수식해야한다.

    무슨말인고..아래와 같다..

     interface ILogger
        {
            void WriteLog(string log);
        }

        class ConsoleLogger : ILogger
        {
            public void WriteLog(string message)
            {
                Console.WriteLine("{0}, {1}", DateTime.Now.ToLocalTime(), message);
            }
        }

       ILogger logger = new ConsoleLogger(); //인터페이스는 인스턴스를 못만들지만 참조는 가능하다. 이 참조에 자식클래스의 객체의 위치를 담는것이다.

        logger.WriteLog("Hello");

    이런식이다..

    그리고 인터페이스를 상속할 수 있는것은 클래스, 구조체 또는 인터페이스도 인터페이스를 상속할 수 있다.

    인터페이스가 인터페이스를 상속하기 위한 문법은 클래스와 같다.

    interface 인터페이스 이름 : 부모 인터페이스

     


     

    클래스는 여러클래스를 한꺼번에 상속하면 안된다.. 왜냐면 알다시피 다이아몬드 상속때문이다.(다이아몬드 상속의 문제 핵심은 모호성! 애매하니까..)

    업캐스팅의 문제도 있다..다중 상속이 허용되면..

                 A (최상위 부모)

              B     C

                  D

    라면..

    C c=new D;

    B b=new D;

    라면...c는 b?c?어떤걸 이용해서 출력하나..

    그래서 C++에서는 다중상속을 허용하나 c#에서는 허용하지 않는다.

    (다중상속대신에..클래스내 필드에 멤버 객체로 넣으면..그게 차라리 낫다. )


         추상 클래스는 인터페이스와는 달리 구현을 가질 수 있다. 하지만 클래스와는 달리 인스턴스를 가질 수 없다.

    한마디로 추상 클래스는 구현을 갖되 인스턴스는 만들지 못함..

    추상 클래스는 어떻게 만드냐..

    c++에서는 virtual 함수=0; 이였는데..

    C#에서는

    한정자에 abstract 를 넣는다..

    abstract class 클래스 이름

    그리고..추상 메소드를 가질 수 있단다..

    구현을 갖지 못하지만 자식클래스에서 반드시 구현하도로 강제하니까..(C++랑 같으 개념)

    그럼 어떻게 하느냐.. 똑같다..

    abstract class A

    {
         public abstract void 추상메소드 이름();

    }

    그럼 상속받는 자식클래스에서는?

    class B : A

    {

    public override void 추상메소드 이름()

    {
    }

    }

    이런식이다!.

     

    추상 메소드가 없는 추상 클래스는 별 의미없는 코드다..즉 추상메소드가 있어야 한다는것..

    이 클래스는 직접 인스턴스화 하지 말고 자식클래스를 만들어서 사용하세요 그리고 어떤 메소드는 꼭 오버라이딩해야합니다!.

    라는 말은 추상클래스로 대체가 된다.

     

    '@ 16. 1 ~ 17. 1 > C#' 카테고리의 다른 글

    getter setter  (0) 2016.11.18
    C# 시작2  (0) 2016.11.16
    C# 시작  (0) 2016.11.16
    C# 2교시...C++차이점위주..  (0) 2014.07.26
    C# 시작하다...  (0) 2014.07.25
Designed by Tistory.