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);
}
}
}
}
출처
[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 |