728x90
- 클래스 상속(IS-A 관계)
- 부모 클래스 : base, parent, 상위, super
- 자식 클래스 : derived, child, 파생, sub
- 클래스의 재사용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _081_01_classInheritance
{
class Super
{
protected int a; //private 불가능, public 가능
public void Print()
{
Console.WriteLine("Super Print()");
}
}
class Sub : Super
{
int b;
public void Print()
{
Console.WriteLine("Sub Print() a : {0}, b : {1}", a, b);
}
}
class Program
{
static void Main(string[] args)
{
Super super = new Super();
super.Print();
Sub sub = new Sub();
sub.Print();
}
}
}
protected 접근 한정자가 사용하된 변수는 상속 받는 클래스에서 접근 가능, public 선언도 가능하지만 private으로 선언하면 부모 클래스에서만 사용이 한정된다.
- 클래스 상속(생성자, 소멸자)
- 상속에서 생성자 함수와 소멸자 함수
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _081_02_classInheritance
{
class Super
{
protected int a;
public Super()
{
a = 100;
Console.WriteLine(" Call Super 생성자 호출");
}
~Super()
{
Console.WriteLine(" Call Super 소멸자 호출");
}
}
class Program
{
static void Main(string[] args)
{
Super super = new Super();
//Sub sub = new Sub();
}
}
}
- base 키워드
: 부모 클래스의 멤버 함수를 호출할 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _081_03_class_base
{
class Super
{
int num;
protected string name;
public Super(int num)
{
this.num = num;
}
public void PrintSuper()
{
Console.WriteLine("Super num : {0}", num);
}
}
class Sub : Super
{
string name;
public Sub(int num, string name) : base(num)
//부모 클래스 Super() 안에 int num 값을 넣었기 때문에 반드시 base로 연결해주어야 한다
{
this.name = name;
}
public void PrintSub()
{
base.name = "Super";
base.PrintSuper();
//부모클래스의 멤버를 가져온다
Console.WriteLine("Super name : {0}", base.name);
Console.WriteLine("Sub name : {0}", this.name);
}
}
class Program
{
static void Main(string[] args)
{
Sub sub = new Sub(26, "Jack");
//"Jack"은 Sub 클래스의 String name
sub.PrintSub();
}
}
}
- is 키워드
- 객체의 형식 검사
- bool 리턴
- as 키워드
- 형식 변환
- null 리턴
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _082_as
{
class Base
{
int num;
public void Print()
{
Console.WriteLine("num : {0}", num);
}
}
class AA : Base
{
int a;
public void PrintA()
{
Console.WriteLine("a : {0}", a);
}
}
class BB : Base
{
int b;
public void PrintB()
{
Console.WriteLine("b : {0}", b);
}
}
class Program
{
static void Main(string[] args)
{
Base _base = new Base();
_base.Print();
Base aa = new AA(); //부모 클래스 이름을 자식 클래스의 객체로 생성 가능
aa.Print();
if(aa is BB)
{
Console.WriteLine("aa는 BB의 객체 입니다");
}
else if(aa is AA)
{
Console.WriteLine("aa는 AA의 객체 입니다");
}
Base bb = new BB();
//BB copyBB = (BB)bb; //캐스팅 연산도 가능하긴 한데 예외 있음
BB copyBB = bb as BB; //강제 형 변환
if(null != copyBB)
{
Console.WriteLine("------------------------------------");
Console.WriteLine("copyBB는 BB객체를 형식 변환!!");
}
//AA copyAA = (AA)bb; //예외 상황 발생(프로그램이 강제종료 될 수 있음)
AA copyAA = bb as AA;
if(null == copyAA)
{
Console.WriteLine("------------------------------------");
Console.WriteLine("copyAA는 AA객체가 아니므로 null!!");
copyAA = new AA();
copyAA.Print();
//copyAA.PrintA(); //원하는 값이 찍히지 않음, 오류(다형성으로 가능)
AA asAA = copyAA as AA; //강제 형 변환
asAA.PrintA();
}
}
}
}
728x90
'게임 프로그래밍 > C#' 카테고리의 다른 글
C# 인터페이스, 추상 클래스, 프로퍼티 (0) | 2021.12.19 |
---|---|
C# 클래스 다형성 (0) | 2021.12.19 |
C# 클래스 static & this (0) | 2021.12.15 |
C# 클래스(접근 한정자, 생성자, 소멸자) (0) | 2021.12.15 |
C# 메서드 오버로딩(Method Overloading) (0) | 2021.12.14 |