C# 클래스 다형성

728x90
  • 다형성 - virtual, override

- 객체 지향의 핵심

- 함수의 오버라이딩(재정의)

- 반복문으로 객체 관리

- virtual과 override 키워드 사용

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

namespace _083_override
{
    class Super
    {
        protected int num;

        public virtual void Print()
        {
            Console.WriteLine("num : {0}", num);
        }
    }
    class AA : Super
    {
        public int a;

        public override void Print()
        {
            base.Print();
            Console.WriteLine("AA a : {0}", a);
        }
    }
    class BB : Super
    {
        public int b;

        public override void Print()
        {
            base.Print();
            Console.WriteLine("BB b : {0}", b);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Super super = new Super();
            super.Print();

            Super aa = new AA();
            aa.Print();

            Super bb = new BB();
            bb.Print();
        }
    }
}

다형성을 활용하면 게임 내 캐릭터를 동작, 관리하기 용이하다.

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

namespace _084_override2
{
    class Army
    {
        protected int _HP;
        protected int _MP;
        protected int _Speed;
        protected int _Attack;

        public virtual void Run()
        {
            Console.Write("{0}의 속도로", _Speed);
        }
        public virtual void Attack()
        {
            Console.WriteLine();

            if(this is Healer)
            {
                Console.Write("[마법 공격력 - {0}]으로 ", _Attack * _MP);
            }
            else
            {
                Console.Write("[공격력 - {0}]으로 ", _Attack);
            }
        }
    }
    class Barbarian : Army
    {
        public Barbarian()
        {
            _HP = 100;
            _MP = 0;
            _Speed = 100;
            _Attack = 100;
        }
        public override void Run()
        {
            base.Run();
            Console.WriteLine("Barbarian 달려갑니다. ");
        }
        public override void Attack()
        {
            base.Attack();
            Console.WriteLine("Barbarian이 칼로 공격!!! ");
        }
    }
    class Giant : Army
    {
        public Giant()
        {
            _HP = 200;
            _MP = 0;
            _Speed = 10;
            _Attack = 200;
        }
        public override void Run()
        {
            base.Run();
            Console.WriteLine("Giant 달려갑니다. ");
        }
        public override void Attack()
        {
            base.Attack();
            Console.WriteLine("Giant 공격!!! ");
        }
    }
    class Healer : Army
    {
        public Healer()
        {
            _HP = 50;
            _MP = 100;
            _Speed = 200;
            _Attack = 10;
        }
        public override void Run()
        {
            base.Run();
            Console.WriteLine("Healer 날아갑니다. ", _Speed);
        }
        public override void Attack()
        {
            base.Attack();
            Console.WriteLine("Healer 마법 공격!!! ");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Army[] arrArmys = new Army[10];

            arrArmys[0] = new Barbarian();
            arrArmys[1] = new Giant();
            arrArmys[2] = new Healer();
            arrArmys[3] = new Healer();
            arrArmys[4] = new Giant();

            for(int i = 0; i < arrArmys.Length; i++)
            {
                if(null != arrArmys[i])
                {
                    arrArmys[i].Run();
                    System.Threading.Thread.Sleep(1000);
                }
            }
            System.Threading.Thread.Sleep(1000);

            for(int i = 0; i < arrArmys.Length; i++)
            {
                if(null != arrArmys[i])
                {
                    arrArmys[i].Attack();
                    System.Threading.Thread.Sleep(1000);
                }
            }
        }
    }
}

  • sealed 키워드 : 상속, 재정의 불가

- 클래스 sealed

sealed class CC
class DD : CC //CC 클래스가 sealed라 오류

- 함수 sealed

class AAA
    public virtual void PrintParent()
class BBB : AAA
    public sealed override void PrintParent()
class CCC : BBB
    public override void PrintParent()
  • 확장 메소드

- this 키워드

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

namespace _087_extension
{
    class AA
    {
        public void View(string str)
        {
            Console.WriteLine("PrintAA {0}", str);
        }
    }
    static class Util
    {
        public static void Print(this AA aa, string str)
        {
            aa.View(str);
        }
        public static void Sum(this int a)
        {
            Console.WriteLine("{0} + {1} = {0}", a, a, a + a);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();

            Util.Print(aa, "Hello");
            aa.Print("Hello");  //이게 가능

            Util.Sum(10);
            10.Sum();  //이게 가능
        }
    }
}

 

  • 클래스 vs 구조체
  class struct
특징 참조 타입(Reference) - 힙에 생성 값 타입(Value) - 스택에 생성
사용 new 연산자 new 연산자 없는 생성 가능
생성자 파라미터 없는  생성자 가능 반드시 파라미터가 있어야 함

- 자료의 크기가 작을 때

- 구조가 단순할 때

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

namespace _085_struct
{
    struct AA
    {
        public int x;
        public int y;

        //public AA() { }  //오류 : 파라미터 없음
        public AA(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        public void Print()
        {
            Console.WriteLine("x : {0}, y : {1}", x, y);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA(10, 20);
            aa.x = 100;
            aa.Print();

            AA aaa;
            aaa.x = 100;
            aaa.y = 200;
            aaa.Print();

            AA copyAA = aa; //value type
            copyAA.x = 1000;
            copyAA.y = 2000;
            
            copyAA.Print();
            aa.Print();
        }
    }
}

 

728x90