Develog
로그인

상속

강성현
∙2026년 8월 31일∙조회 6
C# 프로그래밍상속
본문 로딩 중...
0
강성현

댓글 0

1. 상속이란?

공통된 부분을 한 클래스에 두고, 차이나는 부분만 따로 정의 하는 문법입니다.

공통을 담는 쪽을 기반 클래스, 물려받아 차이를 더하는 쪽은 파생 클래스 라고 합니다.

 

public class <파생 클래스 이름> : <기반 클래스 이름> { // 차이나는 부분만 }

  • 클래스는 두개이상을 상속받을 수 없다.
  • 기본적으로 기반클래스는 어떠한 클래스가 상속받았는지 알 수 없다.
  • 부모생성자 > 자식생성자 순으로 생성자가 실행된다.

 

csharp
public class Item
{
    // 접근제한자 protected : 이 클래스를 상속받은 클래스에서 사용 가능.
    public string Name { get; protected set; }
    public string Description { get; private set; }

    public Item(string name, string description)
    {
        Name = name;
        Description = description;
    }

    public void Use()
    {
        Console.WriteLine($"{Name} 아이템을 사용했다.");
    }

    public void Drop()
    {
        Console.WriteLine($"{Name} 아이템을 버렸다.");
    }
}

public class Sword : Item
{
    public Sword(string name, string description) : base(name, description)
    {
        
    }

 


1-1) 업캐스팅과 다운캐스팅

업캐스팅

  • 자식 클래스에서 부모클래스로의 형변환

자식클래스에서는 부모클래스가 무엇을 가지고 있는지 알지만

부모클래스에서는 자식클래스가 무엇을 가지고 있는지 확인이 불가능하다.

 

따라서, 자식클래스의 인스턴스를 가지고 있더라도 자료형이

상위 클래스라면, 상위 클래스의 기능만 사용가능하다.

csharp
public class Program
{
    public static void Main(string[] args)
    {
        Item potion = new Potion();

        int Num = potion.num; // 
        string Name = potion.name; // name을 읽어올 수 없다. 오류
    }
}

public class Item
{
    public int num;
}

public class Potion : Item
{
    public string name;
}

 

다운캐스팅

부모클래스에서 자식클래스로 형변환 한 것이다.

업캐스팅은 암시적형변환이 가능하지만, 다운캐스팅은 명시해줘야한다.

csharp
// 1번째 방법
if (sword is Sword) // 변환이 가능하다면 진행
{
    s = (Sword)sword;
    s.Upgrade(); // Upgrade 실행 완료.
}

// 2번째 방법
// (sword as Sword)가 가능한 상태라면 변환해주고, 
// 불가능 하다면 쓰레기값 (null)을 넣는다.
(sword as Sword).Upgrade();


public class Item
{
    
}

public class Sword : Item
{
    public void Upgrade()
    {
        Console.WriteLine("업그레이드");
    }
}

 


1-2) base 키워드와 생성자 호출 순서

: base (...) -> 파생 생성자에서 기반 생성자를 지정할 때

 

base.멤버 -> 파생 클래스 안에서 기반 클래스의 멤버를 가리킬 때

  • 이름이 겹치지 않는다면 base. 을 붙이지 않아도 됩니다.

 

기반 생성자 > 파생 생성자 순으로 호출된다.

csharp
public class Program
{
    public static void Main(string[] args)
    {
        Item sword = new Sword("이름");
    }
    
}

public class Item
{
    protected string Name;
    
    public Item(string name)
    {
        Console.WriteLine("부모생성자 호출");
        Name = name;
    }
}

public class Sword : Item
{
    public Sword(string name) : base(name)
    {
        Console.WriteLine("자식생성자 호출");
        Name = name;
    }
}

출력 : 
부모생성자 호출
자식생성자 호출

 


1-3) 메서드 오버라이딩

기반 클래스가 열어놓은 메서드를 파생 클래스에서 자기 방식대로 다시 정의하는 것입니다.

기반 클래스의 메서드에 virtual ,

파생 클래스의 메서드에는 override 를 붙입니다.

csharp
public class Monster  
{  
    protected string name;

    public virtual void Attack()  
    {  
        Console.WriteLine("공격!");  
    }  
}

public class Slime : Monster  
{  
    public override void Attack()  
    {  
        Console.WriteLine(name + "이(가) 몸을 부딪칩니다.");  
    }  
}

public class Dragon : Monster  
{  
    public override void Attack()  
    {  
        Console.WriteLine(name + "이(가) 불을 뿜습니다.");  
    }  
}
  • virtual 은 파생 클래스가 다시 정의해도 된다 라는 의미이고, 붙이지 않으면 파생클래스에서 재정의가 불가능합니다.
  • override 는 기반 클래스의 그 메서드를 다시 정의한다 라는 의미입니다.

 

기반클래스의 동작을 유지하면서 추가로 더하고 싶다면 base.메서드( )를 부르면 된다.

csharp
public class Slime : Monster  
{  
    public override void Attack()  
    {  
        base.Attack(); 
        Console.WriteLine(name + "이(가) 몸을 부딪칩니다.");  
    }  
}

출력  : 
공격!
슬라임이(가) 몸을 부딪칩니다.

 

※ 주의) 오버로딩과 오버라이딩 혼동 위험

항목오버로딩 (overloading)오버라이딩 (overriding)
무엇같은 이름의 메서드를 여러 개 정의물려받은 메서드를 다시 정의
어디같은 클래스 안기반 클래스와 파생 클래스 사이
매개변수달라야 함같아야 함
키워드없음virtual·override
언제 정해지는가컴파일 때실행 때

 

새 글이 올라오면 Develog 알림으로 알려드려요

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

관련 글

제네릭

제네릭

제네릭(generic)이란 클래스나 메서드가 다룰 형식을 정하지 않고, 쓰는 쪽에서 정하게 하는 문법입니다.

9월 9일2
인터페이스

인터페이스

인터페이스(interface)는 특정 동작들을 공통적으로 가지고 있는 것들을 분류하기 위한 용도로 사용됩니다.

9월 8일61
추상클래스

추상클래스

추상클래스란 그 자체로는 인스턴스를 만들 수 없고, 물려받는 용도로만 쓰이는 클래스입니다.

9월 1일41
제네릭
C# 프로그래밍Generic

제네릭

제네릭(generic)이란 클래스나 메서드가 다룰 형식을 정하지 않고, 쓰는 쪽에서 정하게 하는 문법입니다.

강성현
200
강성현
∙9월 9일
200
인터페이스
C# 프로그래밍인터페이스

인터페이스

인터페이스(interface)는 특정 동작들을 공통적으로 가지고 있는 것들을 분류하기 위한 용도로 사용됩니다.

강성현
610
강성현
∙9월 8일
610
추상클래스
C# 프로그래밍추상클래스

추상클래스

추상클래스란 그 자체로는 인스턴스를 만들 수 없고, 물려받는 용도로만 쓰이는 클래스입니다.

강성현
410
강성현
∙9월 1일
410