-
다시한번 개발자도전! 9일차 (상속, 캐스팅,base,오버라이딩)다시한번 개발자도전! 2026. 1. 14. 15:40
🚀 상속(Inheritance)
1. 상속(Inheritance)이란?
- 기존 클래스(부모)의 유산을 그대로 물려받아 새로운 클래스(자식)를 만드는 것.
- 부모 클래스 (Base/Parent): 기능을 나눠주는 클래스
- 자식 클래스 (Derived/Child): 기능을 물려받는 클래스
❗상속을 사용하는 이유
- 코드 재사용: 똑같은 기능을 여러 번 만들 필요 없음.
- 유지보수: 부모 코드만 고치면 자식들은 자동으로 업데이트됨.
- 계층 구조: 유닛 - 전사 - 광전사처럼 논리적인 분류가 가능해짐.
⬇️사용법⬇️
// 부모 클래스 (기반 클래스, 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 권장) 목적 여러 자식을 하나로 묶어 관리 부모 그릇에 담긴 자식의 개별 기능 복구
오늘부터는 학원 끝나고 알바도 해야돼서 공부하기가 더 힘들다ㅠㅠ
열심히 해서 빨리 취업해 버려야지!

'다시한번 개발자도전!' 카테고리의 다른 글
Unity | 추상클래스 (Abstract Class)와 인터페이스(Interface) (0) 2026.01.15 Unity | 다형성(Polymorphism) 이란? (0) 2026.01.14 OOP 4대 원칙과 SOLID 5대 원칙 (0) 2026.01.13 절차지향(Procedural)과 객체지향(Object-Oriented, OOP) (0) 2026.01.13 다시한번 개발자도전! 8일차(클래스,생성자,접근제한자,프로퍼티) (0) 2026.01.13