전체 코드
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
// 42강 클래스 형식 변환
// 객체지향(OOP): 은닉성, 상속성, 다형성
class Player
{
protected int hp;
protected int attack;
}
class Knight : Player
{
}
class Mage : Player
{
public int mp;
}
class Program()
{
static void EnterGame(Player player)
{
// bool isMage = (player is Mage); // Mage 인지
Mage mage = (player as Mage); // Mage로 캐스팅
// is보다 as가 더 깔금해서 as로 사용하기를 추천
if (mage != null)
{
mage.mp = 10;
}
}
static void Main(string[] args)
{
// knight 변수는 stack 메모리
// new Knight()는 heap 메모리
Knight knight = new Knight();
Mage mage = new Mage();
// Mage 타입 -> Player 타입
// Player 타입 -> Mage 타입 ?
Player magePlayer = mage; // 업캐스팅 가능
Mage mage2 = (Mage)magePlayer; // 다운 캐스팅은 명시적 형변환 필요
// Q) Knight -> Player -> Mage로 형변환시
// 원래 Knight 타입이었으나 컴파일 단계에서는 에러 안남(실제 싱행시 crash남)
// 컴파일 과정에서 에러 확인 불가함
// 자식 -> 부모 변환시 아무 문제 없음
// 부모 -> 자식 변환시에 될수도 있고 안될 수 있음(case by case)
// 그러므로, is 연산으로 비교하거나, as 연산자로 캐스팅해서 확인해야함
// is 연산자 : 객체가 특정 형식이나 해당 형식의 파생 형식인지 확인하는데 사용
// as 연산자 : 객체를 지정된 형식으로 변환함(성공시 변환된 객체, 실패시 null)
EnterGame(knight);
EnterGame(mage);
}
}
}
출처
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문| Rookiss - 인프런 강
현재 평점 4.9점 수강생 6,987명인 강의를 만나보세요. 기초 프로그래밍 지식이 없는 사람들을 위한 C# 프로그래밍 기초 강의입니다. 문법 암기 위주의 수업이 아니라, 최대한 필요한 부분만을 요
www.inflearn.com
42강 클래스 형식 변환