상속 / base
2024. 4. 4.

 

상속

- 클래스간 관계를 구축하는 방법

   => 부모 클래스를 상속받은 자식 클래스는 데이터와 기능을 상속 받는다.

   => 일반적으로 상속을 받을 때, 공통점을 찾아내고 추상화한다. 구체화는 자식(파생) 클래스에서 한다.

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 등의 키워드를 사용할 때 이 내용이 사용된다. 

예를 들어, 서로 다른 타입의 객체를 담아야할 때(리스트를 사용한다던가), 부모 타입으로 통일해서 활용할 수 있을 것이다.

더보기
virtual, 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);

    }
}

 

 

참고내용)

 

https://yeko90.tistory.com/entry/c-%EB%8B%A4%ED%98%95%EC%84%B1polymorphism-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9#google_vignette

https://smilejsu.tistory.com/2122

myoskin