본문 바로가기
NOTE/Programming

[C#] 클래스의 상속

by DevAthena 2018. 4. 1.

출저 및 참고 : http://blog.eairship.kr/142 (누구나가 다 이해할 수 있는 프로그래밍 첫걸음 블로그)

를 보면서 공부하고, 나중에 다시 보기 편하게 여기에 정리해 놓은 것입니다. 원본은 위 글입니다~!



상속

- 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 모든 멤버를 물려받게 됩니다.

- 다만, 생성자는 상속되지 않으며 객체 생성시 부모 클래스의 생성자가 자동으로 호출됩니다.

- private로 선언된 멤버는 상속이 불가능 합니다.

- 반대로, 소멸시에는 자식 클래스부터 소멸되고, 부모 소멸자가 소멸됩니다.


- 상속의 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication8
{
    class Parent
    {
        public int num;
 
        public Parent()
        {
            Console.WriteLine("부모 클래스의 생성자가 호출되었습니다");
        }
    }
 
    class Child : Parent
    {
        public Child(int num)
        {
            this.num = num;
            Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
        }
        public void DisplayValue()
        {
            Console.WriteLine("num의 값은 {0} 입니다.", num);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Child cd = new Child(20);
            cd.DisplayValue();
        }
    }
}
cs


결과 : 부모 클래스의 생성자가 호출 되었습니다.

 자식 클래스의 생성자가 호출 되었습니다.

 num의 값은 20 입니다. 


- this 키워드 : 부모 클래스의 멤버 변수에 접근

- base 키워드 : 자식 클래스에도 num이라는 멤버 변수가 존재할 때와 같을 때

1
2
3
4
5
6
7
8
..
        public Child(int num)
        {
            base.num = num;
            Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
        }
..
 
cs



sealed

- 상속 시킬 수 없게 만들 클래스의 이름 앞에다 sealed 키워들 사용하면 된다.

- sealed가 붙은 클래스는 다른 클래스의 부모가 될 수 없다.

- 컴파일 에러가 남. ( ~형식, ~에서 파생될 수 없습니다.)



프로퍼티 get, set은 많이 활용해서 잘 알고 있으니 패쓰해야지 'ㅡ')!


메소드 재정의(Virtual, Override)

- 부모 클래스의 메소드를 자식 클래스에서 다시 정의할 때

- virtual : 부모 클래스의 재정의 될 메소드에 사용

- override: 자식 클래스에서 virtual로 선언된 부모 클래스의 메소드를 재정의 하겠다는 표시.

- private로 지정된 메서드는 재정의 할 수 없습니다.


- 예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication21
{
    class Parent
    {
        public virtual void A()
        {
            Console.WriteLine("부모 클래스의 A() 메서드 호출!");
        }
    }
    class Child : Parent
    {
        public override void A()
        {
            Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
        }
    }
    class Daughter : Parent
    {
        public override void A()
        {
            Console.WriteLine("자식 클래스(Daughter)의 A() 메서드 호출!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent();
            parent.A();
 
            Child child = new Child();
            child.A();
 
            Daughter daughter = new Daughter();
            daughter.A();
        }
    }
}
cs


결과 : 부모 클래스의 A() 메서드 호출!

 자식 클래스(Child)의 A() 메서드 호출!

 자식 클래스(Daughter)의 A() 메서드 호출!



 

멤버 숨기기(new)

- new 지정자를 사용하면 부모 클래스이 멤버를 숨길 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication21
{
    class Parent
    {
        public int x = 100;
        public void A()
        {
            Console.WriteLine("부모 클래스의 A() 메서드 호출!");
        }
    }
    class Child : Parent
    {
        public new int x = 200;
        public new void A()
        {
            Console.WriteLine("자식 클래스(Child)의 A() 메서드 호출!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent();
            parent.A();
            Console.WriteLine("x : {0}", parent.x);
 
            Child child = new Child();
            child.A();
            Console.WriteLine("x : {0}", child.x);
        }
    }
}
cs


결과 : 부모 클래스의 A() 메서드 호출!

 x : 100

 자식 클래스(Child)의 A() 메서드 호출!

 x : 200