C# Class4

Chan·2021년 12월 3일
0

C#

목록 보기
6/10

오버라이딩과 다형성

  • 객체지향 프로그래밍에서 객체는 여러 형태를 가질 수 있음
  • 하위 형식 다형성 subtype polymorphism
    • 부모클래스에서 자식클래스를 통해 다형성 실현 가능
  • 메소드를 오버라이딩하기 위해서는
    • 조건 : 오버라이딩할 메소드는 virtual 키워드로 한정
    • private로 선언한 메소드는 오버라이딩할 수 없음
  • 예시 코드
using System;

namespace Overriding
{
    class ArmorSuite
    {
        public virtual void Initialize() // 오버라이딩할 메소드
        {
            Console.WriteLine("Armored");
        }
    }

    class IronMan : ArmorSuite
    {
        public override void Initialize() // 오버라이딩 메소드
        {
            base.Initialize();
            Console.WriteLine("Repulsor Rays Armed");
        }
    }

    class WarMachine : ArmorSuite
    {
        public override void Initialize()
        {
            base.Initialize();
            Console.WriteLine("Double-Barrel Cannons Armed");
            Console.WriteLine("Micro-Rocket Launcher Armed");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Creating ArmorSuite...");
            ArmorSuite armorsuite = new ArmorSuite();
            armorsuite.Initialize();

            Console.WriteLine("\nCreating IronMan...");
            ArmorSuite ironman = new IronMan();
            ironman.Initialize();

            Console.WriteLine("\nCreating WarMaching...");
            ArmorSuite warmachine = new WarMachine();
            warmachine.Initialize();
        }
    }
}

오버라이딩 봉인

  • 클래스를 상속이 안 되도록 봉인하는 것처럼 메소드도 오버라이딩 안되도록 sealed키워드를 이용하여 봉인
  • virtual로 된 가상 메소드를 오버라이딩한 버전의 메소드만 봉인 가능
using System;

class  Base
{
    public virtual void SealMe() //여기에는 "sealed"를 넣을수 없음
    {
    }
}

class Derived : Base
{
    public sealed override void SealMe() // 오버라이딩 메소드 봉인, 더이상 사용 불가
    {
    }
}

class WantToOverride : Derived
{
    public override void SealMe() // 에러
    {
    }
}

class MainApp
{
    static void Main(string[] args)
    {            
    }
}
  • 봉인 메소드는 자식 클래스 작성자를 위한 부모 클래스 작성자의 배려
  • 자식 클래스 작성자는 자신이 작성한 코드만으로 객체가 원하는대로 동작하지 않는 원인을 알 수 없는 경우가 많음

확장 메소드

  • 기존 클래스의 기능을 확장하는 기법
  • 부모 클래스를 물려받은 자식 클래스에서 필드, 메소드를 추가하는 상속과는 다름
  • 확장 메소드를 이용하면 string 클래스에 문자열 뒤집는 기능도 추가 가능
  • 확장 메소드를 선언하되, static 한정자로 수식
  • 첫번째 매개변수는 반드시 this 키워드와 함께 확장하고자 하는 클래스의 인스턴스여야 함
  • 형식
namespace 네임스페이스이름
{
	public static class 클래스이름
	{
		public static 변환_형식 메소드 이름 (this 대상형식 식별자, 매개변수_목록)
		{
			//
		}
	}
}
  • 예시 코드
using System;
using MyExtension;

namespace MyExtension
{
    public static class IntegerExtension
    {
        public static int Square(this int myInt)
        {
            return myInt * myInt;
	      } 
        public static int Power(this int myInt, int exponent)
        {
            int result = myInt;
            for (int i = 1; i < exponent; i++)
                result = result * myInt;

            return result;
        }
    }
}

namespace ExtensionMethod
{
    class MainApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine($"{3}^2 : {3.Square()}");
            Console.WriteLine($"{3}^{4} : {3.Power(4)}");
            Console.WriteLine($"{2}^{10} : {2.Power(10)}");
        }
    }
}
profile
Backend Web Developer

0개의 댓글