상속
- 상속이란 객체지향 프로그래밍의 특징 중 하나로, 코드의 중복을 줄이고, 유지보수성을 개선할 수 있는 기능입니다
- 공통점을 묶어 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 |