본문 바로가기
IT/C#(CS)

CS 기초강좌 2. C# 클래스 기초

by 신림83 2020. 10. 16.
반응형

CS 기초강좌 2. C# 클래스 기초

간단한게 상속 구조의 클래스를 만들어 보았습니다. 아래 코드

using System;
class Parent
{
    public int data = 0;
}

class Child : Parent
{    
}

class Program
{
    static void Main(string[] args)
    {
        Child c = new Child();
    }
}

class Parent는 부모 클래스이고 class Child : Parent 에 부모를 상속시킨 구조입니다. 

그리고 Child c = new Child(); 코드로 자식을 생성시켜보았습니다.

 

필드의 재정의

using System;
class Parent
{
    public int data = 0;
}

class Child : Parent
{
    public int data = 10; //아..
}

class Program
{
    static void Main(string[] args)
    {
        Child c = new Child();

        Console.WriteLine(c.data);
        Console.WriteLine(((Parent)c).data);
    }
}

출력결과

자식에서 다시 data 정의할수 있습니다. 왠만하면 안하는게 더 좋겠죠. 이런게 가능하단 것과 어떻게 부모의 데이터를 접근할수 있는지(형변환) 등을 봐두시면 됩니다.

 

함수 오버라이드

using System;
class Parent
{
    public void f1() { Console.WriteLine("Parent f1"); }
}

class Child : Parent
{
    public void f1() { Console.WriteLine("Child f1"); }
}

class Program
{
    static void Main(string[] args)
    {
        Parent p = new Parent();
        p.f1();

        Child c = new Child();
        c.f1();

        Parent p1 = new Child();
        p1.f1();
    }
}

출력결과

함수또한 정의가 가능합니다. 해당 함수간의 호출결과를 보시면 됩니다. 부모 레퍼런스에 자식을 생성한뒤 f1을 호출해도 부모의 f1이 호출됩니다. 

가상함수

 명시적으로 가상함수를 만들면, 위와는 다른 결과를 볼수 있습니다. 작업해 봅니다.

using System;
class Parent
{
    public virtual void f1() { Console.WriteLine("Parent f1"); }
}

class Child : Parent
{
    public override void f1() { Console.WriteLine("Child f1"); }
}

class Program
{
    static void Main(string[] args)
    {
        Parent p = new Parent();
        p.f1();

        Child c = new Child();
        c.f1();

        Parent p1 = new Child();
        p1.f1();
    }
}

출력결과

 Parent 클래스 에서 함수에 virtual 을 설정하고 Child에서 override로 명시적으로 가상함수를 쓰겠다고 표시하였습니다. 이렇게 하면 부모 래퍼런스에 자식을 생성했을 때 override 함수를 호출하는 결과를 볼 수 있습니다.

 

상속관계에서 어떤 경우 어떤 맴버와 메소드가 참조되는지를 봐두시면 도움이 될 것입니다.

 

흐음... 

반응형

댓글