상속
- 클래스간 관계를 구축하는 방법
=> 부모 클래스를 상속받은 자식 클래스는 데이터와 기능을 상속 받는다.
=> 일반적으로 상속을 받을 때, 공통점을 찾아내고 추상화한다. 구체화는 자식(파생) 클래스에서 한다.
class 부모 클래스
{
// ...
}
class 자식 클래스 : 부모 클래스
{
// 부모 클래스의 데이터와 기능 사용가능
}
- 주의) 생성된 인스턴스의 타입은 부모 클래스의 타입이 될 수 있다. 그러나 부모 클래스의 인스턴스는 아니므로 주의.
ex)
using System;
public class Unit
{
public string name;
public Unit()
{
}
}
using System;
public class Zealots : Unit
{
public Zealots()
{
}
}
=> Zealots 클래스는 Unit클래스를 상속 받는다.
이 때 Main을 다음과 같이 작성해보자.
using System;
class Program
{
static void Main(string[] args)
{
Zealots zealots = new Zealots();
zealots.name = "질롯1";
}
}
=> new 라는 키워드 뒤에 클래스의 인스턴스가 만들어지는 것이므로 Unit 클래스의 인스턴스가 아니라 Zealots 클래스의 인스턴스이다. 그러나 생성된 인스턴스의 타입은 부모 클래스의 타입이 될 수 있으므로 다음과 같이 작성할 수도 있다.
using System;
class Program
{
static void Main(string[] args)
{
Unit zealots = new Zealots();
zealots.name = "질롯1";
}
}
=> Zealots 클래스의 인스턴스이지만 타입은 Unit 이다. (Unit은 부모 클래스이다.)
=> 다형성(Polymorphism)을 생각해보자.
=> 부모 타입으로 만든다면, 부모 클래스의 메서드와 자식 클래스에서 재정의된 메서드 모두에 접근 가능할 것이다.
=> 그렇다면 재정의 되지 않았다면 어떨까? 부모 메서드와 자식의 메서드 모두에 접근이 가능한건데 하나만 남은것이니, 부모의 메서드를 실행할 것이다.
=> 부모 타입으로 만들었을때 자식 클래스의 기능이 구현될 때, 즉, virtual, abstract, override 등의 키워드를 사용할 때 이 내용이 사용된다.
예를 들어, 서로 다른 타입의 객체를 담아야할 때(리스트를 사용한다던가), 부모 타입으로 통일해서 활용할 수 있을 것이다.





-이해 안가면 하단에 추가해둔 링크를 참고하자.
base
- 부모 클래스를 가리킨다. 부모 멤버에 접근할 수 있게 하는 키워드
- 상속 시 부모 클래스의 생성자가 가장 먼저 호출된다. 그 다음 자식의 생성자가 호출된다.
- 부모 클래스의 오버로딩된 생성자 메서드를 자식에게서 구현하고자할 때 사용한다.
using System;
public class Unit
{
public string name;
public Unit(string name)
{
this.name = name;
}
}
using System;
public class Zealots : Unit
{
public Zealots(string name): base(name)
{
}
}
using System;
class Program
{
static void Main(string[] args)
{
Zealots zealots = new Zealots("질롯1");
Console.WriteLine("->" + zealots.name);
}
}
참고내용)
'C# 개념정리' 카테고리의 다른 글
프로세스 / 프로세스와 스레드 (0) | 2024.05.01 |
---|---|
코루틴(Coroutine) 개념 / 코루틴과 스레드 / 코루틴과 invoke (0) | 2024.04.28 |
virtual, abstract, interface 개념 (+ override와 overload) (0) | 2024.04.09 |
클래스와 객체 / 인스턴스화란? / this (0) | 2024.04.03 |