본문 바로가기
C#

[C#] - 클래스 정의와 상속

by CHML 2016. 9. 15.
1. 클래스 정의

C#에서는 class 키워드를 이용하여 클래스를 정의할 수 있다. 아래의 [코드 1]은 C#에서 Parent 클래스를 정의한 것이다.


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
namespace ex
{
    class Parent
    {
        private string name;
 
        public Parent(string name)
        {
            this.name = name;
            Console.WriteLine("constructor - parent");
        }
 
        ~Parent()
        {
            Console.WriteLine("destructor - parent");
        }
 
        public void PrintName()
        {
            Console.WriteLine(name);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent = new Parent("Name1");
            parent.PrintName();
        }
    }
}
cs

[코드 1] Parent 클래스의 정의


실행 결과:

constructor - parent

Name1

destructor - parent


Parent 클래스에는 멤버 변수 name과 PrintName()이라는 메소드, 생성자 Parent(string name) 및 소멸자 ~Parent()가 정의되어 있다. 생성자는 객체가 생성될 때 호출되며,ㅡ소멸자는 객체가 프로그램에서 제거될 때 호출되는 특수한 메소드이다.

[코드 1]의 9행에는 this라는 키워드가 이용되었는데, this는 객체 자신을 가리키는 특수한 포인터이다. [코드 1]에서 9행의 내용은 객체 자신이 갖고 있는 name이라는 변수에 이름이 같은 매개변수 name의 값을 할당하라는 것이다. 즉, 두 변수 모두 name으로 이름이 같기 때문에 두 변수를 구분하기 위해 this 키워드가 이용되었다.


2. 상속 (Inheritance)

일반적으로 객체지향 프로그래밍에서는 클래스간의 멤버 변수, 멤버 함수 등과 같은 형질을 물려받는 것을 상속이라고 한다. C++에서는 public, private 그리고 protected 형태의 상속을 허용하지만, C#에서는 public 형태의 상속만을 허용한다. 아래의 [코드 2]는 형질을 물려주는 Parent 클래스와 형질을 상속받는 Child 클래스를 정의한 것이다.


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
namespace ex
{
    class Parent
    {
        protected string name;
 
        public Parent(string name)
        {
            this.name = name;
            Console.WriteLine("constructor - parent");
        }
 
        ~Parent()
        {
            Console.WriteLine("destructor - parent");
        }
 
        public void PrintName()
        {
            Console.WriteLine(name);
        }
 
        public virtual void FuncA()
        {
            Console.WriteLine("FuncA() - parent");
        }
    }
 
    class Child: Parent
    {
        private int num;
 
        public Child(string name, int num) : base(name)
        {
            this.num = num;
            Console.WriteLine("constructor - child");
        }
 
        ~Child()
        {
            Console.WriteLine("destructor - child");
        }
 
        public override void FuncA()
        {
            Console.WriteLine("FuncA() - child");
        }
 
        public void PrintInfo()
        {
            Console.WriteLine("name: {0} \t num: {1}", name, num);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child("Name2"20);
 
            child.FuncA();
            child.PrintInfo();
        }
    }
}
cs

[코드 2] Parent 클래스를 상속받는 Child 클래스


실행 결과:

constructor - parent

constructor - child

FuncA() - child

name: Name2    num: 20

destructor - child

destructor - parent


[코드 2]의 Main 함수에는 Child 타입의 객체만 선언하고 있다. 그러나 실행 결과를 보면, Parent 클래스의 생성자가 호출된 다음에 Child 클래스의 생성자가 호출되는 것을 볼 수 있다. 반대로 소멸자는 Child 클래스의 소멸자가 호출된 뒤에 Parent 클래스의 소멸자가 호출되었다. C#은 이와 같이 부모 클래스 생성자 - 자식 클래스 생성자 - 인스턴스 생성 - 자식 클래스 소멸자 - 부모 클래스 소멸자의 단계로 인스턴스가 생성된다.




'C#' 카테고리의 다른 글

[C#] - Microsoft Text Analytics API  (0) 2016.10.09
[C#] - Microsoft Emotion API  (4) 2016.10.05
[C#] - Visual Studio에서 Metro UI Framework 추가하기  (4) 2016.10.03
[C#] - 메소드 (Method)  (0) 2016.09.15