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 키워드가 이용되었다.
일반적으로 객체지향 프로그래밍에서는 클래스간의 멤버 변수, 멤버 함수 등과 같은 형질을 물려받는 것을 상속이라고 한다. 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 |