본문 바로가기
공부,일/C#

210525_2

by fromnothing1 2021. 5. 25.

 overriding 메소드를 객체 기반으로 호출하는 방법 

- 객체 지향 다형성 구현

 

원래는 객체 참조변수 기반으로 overriding 된 메소드가 출력 되었다 .

 

   1. 부모 클래스의 메소드에 virtual 키워드를 추가
   2. 자식 클래스의 메소드에 override 키워드를 추가

 

부모 클래스의 메소드에 virtual 키워드를 추가 하더라도 

자식 클래스의 메소드에 override 키워드 추가 하지 않으면 옛날처럼 객체 참조 변수 기반을 

메소드 출력


using System;

class Instrument
{
    public virtual void Play()
    {
        Console.WriteLine("연주하다.");
    }

}
class Piano : Instrument
{
    public override void Play()
    {
        Console.WriteLine("피피핖아노.");
    }

}
class Guitar : Instrument
{
    public override void Play()
    {
        Console.WriteLine("기기긱타타.");
    }

}
class Drum : Instrument
{
    public override void Play()
    {
        Console.WriteLine("드럼러멀러럼.");
    }

}

class Base : Instrument
{
    // 상위 클래스의 함수가 virtual 선언 되더라도 하위 클래스의 변수가 override 선언 되지 않는다면 
    // 원래 상의 클래스의 함수가 호출된다.
    public void Play() 
    {
        Console.WriteLine("베이이잉스.");
    }

}

class Program
{
    // overriding 메소드를
    // 객체 기반으로 호출하기
    //1. 부모 클래스의 메소드에 virtual 키워드를 추가
    //2. 자식 클래스의 메소드에 override 키워드를 추가
    static void Main(string[] args)
    {
        Instrument[] Orche;
        Orche = new Instrument[5];
        Orche[0] = new Instrument();
        Orche[1] = new Piano();
        Orche[2] = new Guitar();
        Orche[3] = new Drum();
        Orche[4] = new Base();

        foreach (var Temp in Orche)
        {
            Temp.Play();
        }


    }
}

is, as 

 

1. is

bool = (객체) is class  ; -> true or false

객체 참조 변수가 가지고 있는 객체가 어떤 class 인지 물어본다. 

하위 객체는 상위 객체를 포함 하기 때문에 부모 클래스를 같는지 물어 봐도 true 를 return 한다. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Car // 최상위 class 
{
}
class KIA : Car
{
}
class K5 :KIA
{
}

class HyunDai : Car
{
}

class Sonata : HyunDai
{
}


class Program
{
    static void Main(string[] args)
    {

        Car aCar = new Sonata();
        Car bCar = new HyunDai();
        Sonata cCar = new Sonata();

        Console.WriteLine("Sonata객체 is 비교\n");
        Console.WriteLine("aCar가 가지고 있는 객체가  Sonata 인가?  " + (aCar is Sonata));
        Console.WriteLine("aCar가 가지고 있는 객체가  HyunDai 인가?  " + (aCar is HyunDai)); // Sonata 는 HyunDai의 가장 큰 개념이다. 
        Console.WriteLine("aCar가 가지고 있는 객체가  K5 인가?  " + (aCar is K5));
        Console.WriteLine("aCar가 가지고 있는 객체가  KIA 인가?  " + (aCar is KIA)+"\n");

        Console.WriteLine("HyunDai객체 is 위아래비교\n");
        Console.WriteLine("bCar 가지고 있는 객체가  Car 인가?  " + (bCar is Car));
        Console.WriteLine("bCar 가지고 있는 객체가  HyunDai 인가?  " + (bCar is HyunDai));
        Console.WriteLine("bCar 가지고 있는 객체가  Sonata 인가?  " + (bCar is Sonata));

        Console.WriteLine("Sonata객체참조 변수 is 비교\n"); // 어차피 객체 자체를 보기 때문에 객체 참조 변수는상관이 없다.
        Console.WriteLine("cCar 가지고 있는 객체가  Sonata 인가?  " + (cCar is Sonata));
        Console.WriteLine("cCar 가지고 있는 객체가  HyunDai 인가?  " + (cCar is HyunDai)); // Sonata 는 HyunDai의 가장 큰 개념이다. 
        Console.WriteLine("cCar 가지고 있는 객체가  K5 인가?  " + (cCar is K5));
        Console.WriteLine("cCar 가지고 있는 객체가  KIA 인가?  " + (cCar is KIA) + "\n");


    }
}

as

현변환(casting) 의 일종이라 생각하면 된다. 

변환이 가능하면 변환 해주고 불가능 하다면 null 을 반환해 준다. 

 

ex1)

 static void Main(string[] args)
    {
        Car aCar = new K5 ();
        Sonata aSonata;
        KIA aKIA;
        // 변환 해서 망하면 프로그래머 책임 
        // 실행시 변환 불가 -> Run Time Error 발생 
        //aSonata = (Sonata)aCar;

        aSonata = aCar as Sonata; // aCar 가 Sonata 를 포함 하면 넣어준다. 
                                  // 포함하지 않는다면 null 을 aSonata에 넣어준다. 

        Console.WriteLine($"aSonata: {aSonata}");

        aKIA = aCar as KIA;

        Console.WriteLine($"aKIA: {aKIA}");

    }

ex2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class Mammal
{
    public void Nurse()
    {
        Console.WriteLine("Nurse()");
    }

}

class Dog: Mammal
{
    public void Bark()
    {
        Console.WriteLine("Bark()");
    }

}

class Cat : Mammal
{
    public void Meow()
    {
        Console.WriteLine("Meow()");
    }
}


class Program
{
    static void Main(string[] args)
    {
        Mammal aMammal = new Dog();
        Dog aDog;

        if(aMammal is Dog) // is 사용한 방식 
        {
            aDog = (Dog)aMammal;
            aDog.Bark();
        }

        Mammal bMammal = new Cat();

        Cat aCat = bMammal as Cat;
        if (aCat != null)
        {
            aCat.Meow();
        }

        Cat bCat = aMammal as Cat; //aMammal = dog 객체를 가지는 객체참조변수
        if (bCat != null)
        {
            bCat.Meow();
        }
        else
        {
            Console.WriteLine("bCat is not a Cat:");

        }

    }
}

 

 

readonly

읽기 전용 상수 : 생성할때 또는 생성자에서 단 1번 초기화 되는 변수

 

cf) const(상수) = 생성시 바로 초기화 해줘야 한다. 그리고 코드 실행전에 만들어져서 고정 되어 있다. 메모리 code/text 부분에 저장 되어 있음 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Smart
{
    public readonly int rNum;
    public const int cNum = 200;
    public Smart(int Num)
    { 
        rNum = Num;
    }

}
class Program
{
    static void Main(string[] args)
    {
        Console.Write("숫자를 입력하시요 : ");
        int inputNum = int.Parse(Console.ReadLine());

        Smart aSamrt = new Smart(inputNum);

        Console.WriteLine($"Smart rNum : {aSamrt.rNum}");
        Console.WriteLine($"Smart cNum : {Smart.cNum}");

        //aSmart.rNum = 300; 변경 불가 
    }

 

분할 클래스

partial 키워드를 통해서 클래스를 2로 나누어서 선언 할 수 있음 

클래스가 너무 길때 여러 파일로 나누어서 관리할 때 사용함

partial class Myclass

{

        내용1~~~;

}

partial class Myclass

{

        내용2~~~;

}

'공부,일 > C#' 카테고리의 다른 글

List class  (0) 2021.06.03
210602  (0) 2021.06.02
210525  (0) 2021.05.25
210524  (0) 2021.05.24
book class 만들기  (0) 2021.05.23

댓글