본문 바로가기

C#/기본 문법

C# 다형성


new 한정자(다형성 x)


 

class Player
{
    protected int hp;
    protected int attack;

    public void Move()
    {
        Console.WriteLine("Player 이동");
    }
}

class Knight : Player
{
    // 함수 new 한정자로 부모 클래스의 메소드를 숨김(다형성 x)
    public new void Move()
    {
        Console.WriteLine("Knight 이동");
    }
}

class Mage : Player
{
    // 함수 new 한정자로 부모 클래스의 메소드를 숨김(다형성 x)
    public new void Move()
    {
        Console.WriteLine("Mage 이동");
    }
}

 

new 한정자는 부모 클래스의 메소드를 "숨긴다" 고 합니다.

virtual/override는 메소드를 재정의하여 다형성을 가지지만, new는 override와는 다르게 다형성을 가지지 않습니다.

 

 

static void EnterGame(Player player)
{
    player.Move();
}

static void Main(string[] args)
{
    Knight knight = new Knight();
    Mage mage = new Mage();

    EnterGame(knight);
    EnterGame(mage);
}

 

 

출력

Player 이동
Player 이동

 

각각 파생 클래스의 이동이 아니라, Player 이동이 됨

이로 인해 함수 오버라이딩이 필요

 

 

 

 

 

다형성


 

using Rookiss_CSharp;
using System;
using System.Diagnostics.Metrics;
using System.Numerics;

namespace Rookiss_CSharp
{
    // https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N
    // 43강 다형성

    // 객체지향(OOP): 은닉성, 상속성, 다형성

    class Player
    {
        protected int hp;
        protected int attack;

        // 참고 : virtual은 일반 함수보다 성능에 영향을 주니, 모든 함수를 virtual로 하지는 말아야함

        public virtual void Move() // virtual로 명시된 함수만 하위 클래스에서 override로 재정의 가능
        {
            Console.WriteLine("Player 이동");
        }

        class SuperKnight : Player
        {
            public override void Move()
            {
                Console.WriteLine("Super Knight 이동");
            }
        }

        class Knight : SuperKnight
        {
            public sealed override void Move() // sealed 한정자 : 더 이상 하위 클래스에서 재정의(override)할 수 없도록 막는 가상 함수(즉, Knight가 마지막)
            {
                // base.Move(); // 필요시 부모 함수 따로 호출도 가능
                Console.WriteLine("Knight 이동"); // 상위 클래스 SuperKnight가 있어도 결국 최종 정의된 Knight의 Move()가 호출됨
            }
        }

        class Mage : Player
        {
            public int mp;
            public override void Move()
            {
                Console.WriteLine("Mage 이동");
            }
        }

        // 헷갈리는 용어 정리
        // 오버로딩 : 이름 같지만 함수 인자 다르게 해서 구현
        // 오버라이딩 : 다형성 활용, 자식에서 함수 재정의, 타입에 따라 다양한 형태로 동작하기 위함

        class Program()
        {
            static void EnterGame(Player player)
            {
                player.Move(); // 다형성을 활용, 런타임에 어떤 타입인지 판단하여 해당 오버라이딩된 함수를 호출함

                /*
                Mage mage = (player as Mage);

                if (mage != null)
                {
                    mage.mp = 10;
                }
                */
            }

            static void Main(string[] args)
            {
                Knight knight = new Knight();

                Mage mage = new Mage();

                // Player magePlayer = mage;
                // Mage mage2 = (Mage)magePlayer;

                EnterGame(knight);
                EnterGame(mage);
            }
        }
    }
}

 


 

 

 

출처


https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1?srsltid=AfmBOopkXVxKs-MQPYZkTjEYW-yIDMO5xP7l5hQq0hQasUWhobvyKO6N

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문| Rookiss - 인프런 강

현재 평점 4.9점 수강생 6,987명인 강의를 만나보세요. 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요

www.inflearn.com

41강 은닉성

 

 

https://solo5star.tistory.com/8

 

C# 메소드에서의 new 한정자는 꼭 필요한가?

리뉴얼 된 블로그로 보기: https://solo5star.dev/posts/8/ C# 메소드 한정자 중에는 new 라는 것이 있습니다. class BaseClass { public void SomeMethod() => Console.WriteLine("BaseClass"); } class DerivedClass : BaseClass { public new v

solo5star.tistory.com

 

 

'C# > 기본 문법' 카테고리의 다른 글

C# 접근 제한자 , 어셈블리란?  (0) 2025.11.05
C# 문자열 둘러보기  (0) 2025.11.05
C# 클래스 형식 변환  (0) 2025.11.05
C# 은닉성  (0) 2025.11.02
C# 상속성  (0) 2025.11.02