상속

상속


  • 상속이란 객체지향 프로그래밍의 특징 중 하나로, 코드의 중복을 줄이고, 유지보수성을 개선할 수 있는 기능입니다
  • 공통점을 묶어 base클래스, 즉 부모클래스로 두고 이를 상속시키는 파생,자식 클래스를 만들어 중복코드를 줄이고 간결하게 작성 가능하게됩니다
  • 하지만 다중상속을 지원하지 않습니다

상속의 주요 이점

1. 코드 재사용 : 공통된 코드를 부모 클래스에서 한번만 작성하고 자식 클래스들이 이를 물려받아 중복코드를 줄입니다

2. 다형성 : 기반클래스 타입의 참조 변수가 파생 클래스의 객체를 가리킬 수 있게 하여, 하나의 인터페이스로 다양한 형태의 객체를 처리할 수 있게 합니다

3. 확장성 : 기존 코드를 수정하지 않고 새로운 파생클래스를 추가해 기능을 확장 할 수 있습니다


상속 구현방법

 //base클래스, 부모클래스
class Car 
{
	protected float speed;
}

 //파생클래스, 자식
class Sedan : Car  // 상속받고자 하는 클래스를 : [클래스명] 으로 적으면 끝
{
}

class SportsCar : Car
{
}

 

  • 상속에는 접근지정자로 private말고 부모자식간에는 보이게 하는 protected가 있다

 


상속 심화

 

: base 키워드

  • 자식클래스 내에서 부모클래스의 멤버(필드,메서드,생성자 등) 에 접근하는데 사용됩니다
  • 주로 많이 쓰이는 용도는 생성자 호출에서 부모 클래스의 생성자를 호출할 때 사용합니다
  • base.으로 오버라이딩된 부모클래스의 원래 구현을 호출할 수도 있습니다
  • 인자갑을 부모가 처리하게 던져주는 기능도 가능하다

sealed 키워드

  • 봉인을 의미하며 더이상 상속이나 재정의를 금지하는 역할
  • 클래스가 무분별하게 확장되거나 변경되는 것을 방지하며 보안 및 성능을 최적화하는데 좋다
  • 메서드나 멤버에 sealed를 쓰면 더이상 재정의 되지 못하게 막을 수 있습니다

다형성과 오버라이딩

  • 상속에서는 필요할 경우 base(부모)형으로 모습을 바꿀 수 있습니다
  • 자식객체를 만들고 부모형태에 담기가 가능합니다
  • 다형성의 주요 메커니즘은 메서드 오버라이딩입니다
  • 오버라이딩은 상속관계에서 부모 클래스의 메서드를 파생클래스에서 재정의하여 사용하는 것을 의미합니다

심화 사용 예제

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Day14
{
    class Car //뼈대가 되는 base클래스 , 부모클래스
    {
        protected float _maxSpeed; //부모자식간에는 보이게하는 외부에는 안보이는 protected
        protected string _brand;

        public virtual void Drive()  //가상함수 virtual, 자식단에서 재정의 가능한 함수가 됨
        {
            Console.WriteLine("주행");
        }  
        //생성자
        public Car()
        {
            Console.WriteLine("인자값없는 차 생산자");
        }
        //인자값 하나 요구하는 생성자
        public Car(float maxSpeed)
        {
            _maxSpeed = maxSpeed;
            Console.WriteLine("float를 하나 받고 시작하는 car 생성자");
        }

    }
    //파생클래스,자식
    sealed class Sedan : Car // sealed 더이상  파생못하게 막기,봉인
    {
        int _passengers;
        
        public void SedanAction()
        {
            Console.WriteLine("동승자 태우기");
        }
        
        public override void Drive() //base의 Drive를 재정의함
        {
        	base.Drive();   //부모의 드라이브 즉 주행이 뜨게함
            Console.WriteLine("승용차 주행");
        }
        
        //public Sedan() : base()    //base치고 옆에 인자값 없는거 찾아서 수행
        //public Sedan() : base(12.44f)    //base치고 옆에 인자값 float가 있는거 찾아서 수행
        public Sedan() : base(12.14f)
        {
            Console.WriteLine("인자값 없는 세단 생성");
        }
        
        //받은 인자값을 부모가 처리하게 던져주기 가능
        public Sedan(int PassNum,float maxSpeed) : base(maxSpeed) 
        {
            _passengers=PassNum;
            Console.WriteLine("인자값 2개 요구하는 세단");
        }

    }
   
    internal class Program
    {

        static void Main(string[] args)
        {
            //Sedan myCar1 = new Sedan();
            Sedan myCar2 = new Sedan(5,174.21f);
           
        }
    }
}

 


쉐도잉

  • 쉐도잉이란 상속관계에 있는 두 클래스에서 같은 이름의 멤버(필드,메서드,속성)을 선언했을 때 자식 클래스의 멤버가 부모클래스의 멤버를 가리는 것을 의미합니다
  • 보통 쉐도잉은 virtual(가상)선언을 하지 않고 멤버를 재정의 할 때 발생합니다

'C# > 객체지향 활용과 응용 개발' 카테고리의 다른 글

메모리와 GC(가비지 컬렉터)  (0) 2025.11.15
추상 클래스  (0) 2025.10.10
Static  (0) 2025.10.10
생성자와 클래스 심화  (0) 2025.10.05
객체지향과 클래스  (0) 2025.10.05