본문 바로가기

:SERVER/C#(C Sharp)

클래스 특성 - 상속성/은닉성/다형성

반응형

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