반응형
1. 상속성
using System;
namespace CSharp {
// 객체 지향 OOP; Object Oriented Programming
// [부모 클래스; 기반 클래스]
class Player {
// 필드. 필드는 인스턴스마다 제각각인 값을 가진다.
static public int counter; // Knight 인스턴스 모두 공유. 오로지 하나만 존재.
public int id;
public int hp;
public int attack;
public Player() {
System.Console.WriteLine("Player생성자 호출");
}
public Player(int hp) {
this.hp = hp;
System.Console.WriteLine("Player-hp생성자 호출");
}
public void Move() {
System.Console.WriteLine("Player Move");
}
public void Attack() {
System.Console.WriteLine("Player Attack");
}
}
// [자식 클래스; 파생 클래스]
class Mage: Player {}
class Knight : Player {
int k;
public void test() { } // 인스턴스에 종속됨
static public void test2() { // 클레스에 종속됨
// 정적 속성, 정적 메소드에서는 this키워드 사용 금지
// 정적 속성에만 접근 가능.
}
static public Knight CreateKnight() {
Knight knight = new Knight();
knight.hp = 100;
knight.attack = 1;;
return knight;
}
// 생성자
public Knight(): base(50){ //부모 클래스의 생성자가 여러개 일 때, 어떤 생성자를 사용할지 선택 가능 Palyer() 혹은 base()
this.k = 1; // 나의 필드 값
base.hp = 50; // 부모 클래스의 필드 값
System.Console.WriteLine("Knight생성자 호출");
hp=100;
attack=10;
}
public Knight(int hp) : this() {
this.hp = hp;
this.attack = 10;
}
public Knight(int hp, int attack){
this.hp = hp;
this.attack = attack;
}
public Knight Clone() {
Knight knight = new Knight();
knight.hp = this.hp;
knight.attack = this.attack;
return knight;
}
}
class Program{
// Main 함수
static void Main(string[] args) {
Knight knight = new Knight(5);
knight.hp = 100;
knight.attack = 10;
knight.Move();
knight.Attack();
knight.test(); // 함수 - 인스턴스에서 호출
Knight.test2(); // static 함수 - 클래스에서 호출
}
}
}
1-2. 클래스 형변환
using System;
namespace CSharp {
class Player {
protected int hp;
protected int attack;
}
class Knight: Player{}
class Mage: Player {
public int mp;
}
class Program{
static void EnterGame(Player player) {
// 1번 방법
if(player is Mage) {
Mage mage = (Mage)player;
mage.mp = 10;
}
// 2번 방법
Mage mage1 = (player as Mage);
if(mage1!=null) { // null은 없다라는 뜻과 동일함. 아무것도 가리키지 않는 상태.
mage1.mp = 10;
}
}
// Main 함수
static void Main(string[] args) {
Knight knight = new Knight();
Mage mage = new Mage();
// Mage 타입 -> Player 타입
Player magePlayer = mage;
// player 타입 -> Mage? Kinght? Player?
Mage mage2 = (Mage)magePlayer; // 클래스 형변환
EnterGame(knight);
EnterGame(mage);
}
}
}
2. 은닉성
using System;
namespace CSharp {
class Knight{
// 접근 한정자
// 기본값은 private
// public - 외부에서 사용 가능
// protected - 상속받은 자식 클래스에서 사용 가능. 외부에서는 사용 불가능
// private - 클래스만 사용. 외부에서 사용 불가능
// internal
// protected internal
private int hp;
protected int b;
public void setHp(int hp) { // 필드를 public으로 만들지 않고 set함수를 만드는 이유는 디버그에 용이하므로..
this.hp = hp;
}
}
class Program{
// Main 함수
static void Main(string[] args) {
}
}
}
3. 다형성
using System;
namespace CSharp {
// 다형성: 형태에 따라서 다양하게 동작하겠다.
// 오버로딩 vs 오버라이딩!
// 오버로딩: 함수 이름의 재사용
// 오버라이딩: 다형성을 이용.
class Player {
protected int hp;
protected int attack;
public virtual void Move() {
System.Console.WriteLine("player 이동");
}
}
class Knight: Player{
public override void Move() {
base.Move();
System.Console.WriteLine("knight 이동");
}
}
class Mage: Player {
public int mp;
// sealed : Mage를 상속받은 자식클래스에서는 Move 힘수를 override 할 수 없다.
public sealed override void Move() {
System.Console.WriteLine("mage 이동");
}
}
class Program{
static void EnterGame(Player player) {
player.Move(); // player 타입에 따라 런타임에서 캐치해서 Move()함수 호출.
// 1번 방법
if(player is Mage) {
Mage mage = (Mage)player;
mage.mp = 10;
}
// 2번 방법
Mage mage1 = (player as Mage);
if(mage1!=null) { // null은 없다라는 뜻과 동일함. 아무것도 가리키지 않는 상태.
mage1.mp = 10;
}
}
// Main 함수
static void Main(string[] args) {
Knight knight = new Knight();
Mage mage = new Mage();
// Mage 타입 -> Player 타입
Player magePlayer = mage;
// player 타입 -> Mage? Kinght? Player?
Mage mage2 = (Mage)magePlayer; // 클래스 형변환
EnterGame(knight);
EnterGame(mage);
}
}
}
반응형
':SERVER > C#(C Sharp)' 카테고리의 다른 글
클래스, 생성자, static (0) | 2022.09.16 |
---|---|
스택,힙 메모리, 클래스 (0) | 2022.09.16 |
함수, ref, out (0) | 2022.09.15 |
반복문 (0) | 2022.09.14 |
분기문(if문, switch문, 삼항연산자) (0) | 2022.09.14 |