ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다시한번 개발자도전! 9일차 (상속, 캐스팅,base,오버라이딩)
    다시한번 개발자도전! 2026. 1. 14. 15:40

     

    🚀 상속(Inheritance) 


    1. 상속(Inheritance)이란?

    • 기존 클래스(부모)의 유산을 그대로 물려받아 새로운 클래스(자식)를 만드는 것.
    • 부모 클래스 (Base/Parent): 기능을 나눠주는 클래스
    • 자식 클래스 (Derived/Child): 기능을 물려받는 클래스

     

    상속을 사용하는 이유

    1. 코드 재사용: 똑같은 기능을 여러 번 만들 필요 없음.
    2. 유지보수: 부모 코드만 고치면 자식들은 자동으로 업데이트됨.
    3. 계층 구조: 유닛 - 전사 - 광전사처럼 논리적인 분류가 가능해짐.

    ⬇️사용법⬇️

    // 부모 클래스 (기반 클래스, Base Class)
    class Parent
    {
        // 공통 멤버
    }
    
    // 자식 클래스 (파생 클래스, Derived Class)
    class Child : Parent  // : Parent로 상속
    {
        // 상속받은 멤버 + 추가 멤버
    }

     

     


    2. virtual & override

    • 부모가 물려준 기능을 자식이  고쳐 쓰는 방법.
    • virtual (허락): "이 메서드는 자식이 수정해도 돼!" 
    • override (재정의): "제가 다시 정의할게요!"

    💡 왜 사용하는지?

    •  업캐스팅(부모 그릇에 자식 담기)을 했을 때, override를 해둬야만 알맹이(자식)의 메서드가 호출되기 때문임.

    ⬇️사용법⬇️

    public class Monster
    {
        public string name;
    
        public virtual void Shout() //virtual 키워드를 붙여 자식들이 재정의 할 수 있게함
        {
            Console.WriteLine("몬스터가 평범하게 웁니다.");
        }
    }
    
    public class Slime : Monster
    {
        public override void Shout() //재정의
        {
            Console.WriteLine("슬라임이 뿕뿕하고 소리냅니다.");
        }
    }
    
    public class Dragon : Monster
    {
        public override void Shout() //재정의
        {
            Console.WriteLine("드래곤이 캬오오오! 하고 포효합니다.");
        }
    }

    3. base 키워드

    • 부모의 원래 기능을 실행하면서 내 기능을 추가하고 싶을 때 사용.
    public class Boss : Monster
    {
        public override void Shout()
        {
            base.Shout(); // 일단 부모의 "평범하게 웁니다" 실행
            Console.WriteLine("하지만 보스라서 땅이 울립니다!"); // 내 기능 추가
        }
    }

     

    ⬇️생성자에 base 써보기⬇️

    더보기
    / 부모 클래스 (Base Class)
    public class Unit
    {
        public string Name;
        public int HP;
    
        // 부모의 생성자
        public Unit(string name, int hp)
        {
            this.Name = name;
            this.HP = hp;
            Console.WriteLine($"[부모] {Name} 생성됨 (HP: {HP})");
        }
    }
    
    // 자식 클래스 (Derived Class)
    public class Warrior : Unit
    {
        public int Strength;
    
        // base 키워드로 부모 생성자에 데이터를 전달함
        public Warrior(string name, int hp, int strength) : base(name, hp)
        {
            this.Strength = strength;
            Console.WriteLine($"[자식] 전사 특성(힘: {Strength}) 초기화 완료");
        }
    }

    🎭 캐스팅 (Casting)

    상속 관계에 있는 클래스끼리는 서로 형변환이 가능함.

     

    1. 업캐스팅 (Upcasting)

    • 방향: 자식 → 부모
    • 특징: 언제나 안전함 (자동 변환).
    • 효과: 여러 종류의 자식을 하나의 배열(Unit [])로 묶어 관리 가능.
    // Warrior(자식)는 Unit(부모)을 상속받음
    Unit myUnit = new Warrior(); // 업캐스팅 (자동)
    
    myUnit.Move(); // 가능 (부모에 있는 기능 override 했을경우 자식 메서드가 실행됨)
    // myUnit.Slash(); // 불가능! (자식 전용 기능은 부모 그릇에서 안 보임)

     

    2. 다운캐스팅 (Downcasting)

    • 방향: 부모 → 자식
    • 특징: 위험함 (명시적 변환 필요). 진짜 그 자식이 맞는지 확인 안 하면 게임 터짐.
    Unit myUnit = new Warrior(); // 일단 업캐스팅 상태
    
    // Warrior warrior = myUnit; // 에러! (부모가 다 자식인 건 아니니까)
    Warrior warrior = (Warrior)myUnit; // 다운캐스팅 (명시적)
    
    warrior.Slash(); // 이제 전사 전용 기능 사용 가능!

     

    ❗ 다운캐스팅 주의사항

    • as 연산자: 변환 실패 시 null 반환.
    • is 연산자: 타입 확인 후 true/false 반환.

    as 연산자 

    형변환에 실패하면 null을 반환함.

    Warrior w = myUnit as Warrior;
    if (w != null) {
        w.Slash(); // 안전하게 실행
    }

    is 연산자

    타입이 맞는지 미리 확인하고 true/false를 반환.

    if (myUnit is Warrior) {
        Warrior w = (Warrior)myUnit;
        w.Slash();
    }

     

    ⭐ 캐스팅 요약 

    구분 업캐스팅 (Upcasting) 다운캐스팅 (Downcasting)
    방향 자식 → 부모 부모 → 자식
    변환 방식 자동 (암시적) 수동 (명시적, () 필요)
    안전성 항상 안전함 위험함 (is, as 권장)
    목적 여러 자식을 하나로 묶어 관리 부모 그릇에 담긴 자식의 개별 기능 복구

     

     


    오늘부터는 학원 끝나고 알바도 해야돼서 공부하기가 더 힘들다ㅠㅠ

    열심히 해서 빨리 취업해 버려야지!

Designed by Tistory.