... | @@ -4,7 +4,7 @@ |
... | @@ -4,7 +4,7 @@ |
|
### **클래스**
|
|
### **클래스**
|
|
**클래스(Class)**에는 *Field*, *Method*, *생성자*, *소멸자*와 같은 *멤버(Member)*를 포함할 수 있다. *Filed*는 클래스 내부에 선언된 속성으로 임의 형식의 변수를 말한다. 멤버를 선언할 때 접근 한정자를 생략하면 `private`으로 정의된다. 객체를 생성할 때는 `new` 키워드를 사용하며 **Reference Type**으로 할당된다. 단, C#에서는 `delete`와 같은 키워드가 없어서 의도적으로 할당 해제를 할 수 없다.
|
|
**클래스(Class)**에는 *Field*, *Method*, *생성자*, *소멸자*와 같은 *멤버(Member)*를 포함할 수 있다. *Filed*는 클래스 내부에 선언된 속성으로 임의 형식의 변수를 말한다. 멤버를 선언할 때 접근 한정자를 생략하면 `private`으로 정의된다. 객체를 생성할 때는 `new` 키워드를 사용하며 **Reference Type**으로 할당된다. 단, C#에서는 `delete`와 같은 키워드가 없어서 의도적으로 할당 해제를 할 수 없다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Person
|
|
class Person
|
|
{
|
|
{
|
|
private string name; // Field
|
|
private string name; // Field
|
... | @@ -46,7 +46,7 @@ class Person |
... | @@ -46,7 +46,7 @@ class Person |
|
* **인스턴스 멤버** : `new` 키워드를 사용해서 메모리에 할당된 객체의 멤버이다.
|
|
* **인스턴스 멤버** : `new` 키워드를 사용해서 메모리에 할당된 객체의 멤버이다.
|
|
* **정적 멤버** : `static` 키워드를 사용하여 객체를 생성하지 않고도 전역으로 사용할 수 있는 멤버이다. **정적 멤버**로 사용할 수 있는 멤버로는 *Filed*, *Method*, *생성자*가 있다. 객체에 *정적 생성자* 있으면 이 생성자를 실행하기 전에 *정적 멤버*가 초기화되며, *정적 생성자*가 없으면 *정적 멤버*를 처음 사용하기 전에 초기화가 된다.
|
|
* **정적 멤버** : `static` 키워드를 사용하여 객체를 생성하지 않고도 전역으로 사용할 수 있는 멤버이다. **정적 멤버**로 사용할 수 있는 멤버로는 *Filed*, *Method*, *생성자*가 있다. 객체에 *정적 생성자* 있으면 이 생성자를 실행하기 전에 *정적 멤버*가 초기화되며, *정적 생성자*가 없으면 *정적 멤버*를 처음 사용하기 전에 초기화가 된다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Person
|
|
class Person
|
|
{
|
|
{
|
|
public static int id = 0; // 정적 Filed
|
|
public static int id = 0; // 정적 Filed
|
... | @@ -63,7 +63,7 @@ class Person |
... | @@ -63,7 +63,7 @@ class Person |
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
Console.WriteLine(Person.id); // 출력 결과 : 0
|
|
Console.WriteLine(Person.id); // 출력 결과 : 0
|
|
Person.printICount(); // 출력 결과 : 0
|
|
Person.printICount(); // 출력 결과 : 0
|
|
```
|
|
```
|
... | @@ -71,7 +71,7 @@ Person.printICount(); // 출력 결과 : 0 |
... | @@ -71,7 +71,7 @@ Person.printICount(); // 출력 결과 : 0 |
|
#### **Namespace**
|
|
#### **Namespace**
|
|
**Namespace**를 정의함으로써 수많은 클래스와 Method를 분류하여 쉽게 구분할 수 있도록 해준다. **.NET Framework**에서는 **Namespace**를 사용하여 **기본 클래스 라이브러리(Basic CLass Library, BCL)**를 분류해 놓았다.
|
|
**Namespace**를 정의함으로써 수많은 클래스와 Method를 분류하여 쉽게 구분할 수 있도록 해준다. **.NET Framework**에서는 **Namespace**를 사용하여 **기본 클래스 라이브러리(Basic CLass Library, BCL)**를 분류해 놓았다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
namespace InputDvice
|
|
namespace InputDvice
|
|
{
|
|
{
|
|
class Keyboard { }
|
|
class Keyboard { }
|
... | @@ -82,18 +82,18 @@ namespace OutputDvice |
... | @@ -82,18 +82,18 @@ namespace OutputDvice |
|
class Monitor { }
|
|
class Monitor { }
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
InputDvice.Keyboard keyboard = new InputDvice.Keyboard();
|
|
InputDvice.Keyboard keyboard = new InputDvice.Keyboard();
|
|
OutputDvice.Monitor monitor = new OutputDvice.Monitor();
|
|
OutputDvice.Monitor monitor = new OutputDvice.Monitor();
|
|
```
|
|
```
|
|
|
|
|
|
* `using` 키워드로 **Namespace**를 미리 선언하면 생략해서 사용할 수 있다.
|
|
* `using` 키워드로 **Namespace**를 미리 선언하면 생략해서 사용할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
using InputDvice;
|
|
using InputDvice;
|
|
using OutputDvice;
|
|
using OutputDvice;
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
Keyboard keyboard = new Keyboard();
|
|
Keyboard keyboard = new Keyboard();
|
|
Monitor monitor = new Monitor();
|
|
Monitor monitor = new Monitor();
|
|
```
|
|
```
|
... | @@ -101,7 +101,7 @@ Monitor monitor = new Monitor(); |
... | @@ -101,7 +101,7 @@ Monitor monitor = new Monitor(); |
|
### **인터페이스**
|
|
### **인터페이스**
|
|
**인터페이스(Interface)**는 세부적인 내용은 구현하지 않고, 객체가 기본적으로 가져야 할 공통적인 기능들만 정의한 것이다. 정의된 기능들은 **인터페이스**를 상속받은 객체에서 반드시 재정의해야 하고, 그 안에서 세부적인 내용을 추가한다. **인터페이스**에는 **Method**, **Property**, **Event**, **Indexer**를 멤버로 사용할 수 있다.
|
|
**인터페이스(Interface)**는 세부적인 내용은 구현하지 않고, 객체가 기본적으로 가져야 할 공통적인 기능들만 정의한 것이다. 정의된 기능들은 **인터페이스**를 상속받은 객체에서 반드시 재정의해야 하고, 그 안에서 세부적인 내용을 추가한다. **인터페이스**에는 **Method**, **Property**, **Event**, **Indexer**를 멤버로 사용할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
interface IKeyboard
|
|
interface IKeyboard
|
|
{
|
|
{
|
|
void pressed();
|
|
void pressed();
|
... | @@ -126,7 +126,7 @@ class Computer : IKeyboard, IMouse // 다중 상속 가능 |
... | @@ -126,7 +126,7 @@ class Computer : IKeyboard, IMouse // 다중 상속 가능 |
|
### **상속**
|
|
### **상속**
|
|
**상속(Inheritance)**은 기존 클래스에서 이미 정의된 것들을 다른 클래스에서 사용하거나, 추가 또는 재정의할 수 있도록 한 것이다. 여기서 기존 클래스는 *기반(Based) 클래스*라고 하고, 상속받은 다른 클래스는 *파생(Derived) 클래스*라고 부른다. *파생 클래스*는 하나의 기반 클래스만 상속 받을 수 있으며, *파생 클래스*가 다른 클래스의 *기반 클래스*가 될 수도 있다. C#에서는 `base` 키워드를 사용하여 *기반 클래스*의 생성자나 Method를 호출할 수 있다.
|
|
**상속(Inheritance)**은 기존 클래스에서 이미 정의된 것들을 다른 클래스에서 사용하거나, 추가 또는 재정의할 수 있도록 한 것이다. 여기서 기존 클래스는 *기반(Based) 클래스*라고 하고, 상속받은 다른 클래스는 *파생(Derived) 클래스*라고 부른다. *파생 클래스*는 하나의 기반 클래스만 상속 받을 수 있으며, *파생 클래스*가 다른 클래스의 *기반 클래스*가 될 수도 있다. C#에서는 `base` 키워드를 사용하여 *기반 클래스*의 생성자나 Method를 호출할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class BaseClass
|
|
class BaseClass
|
|
{
|
|
{
|
|
private string a;
|
|
private string a;
|
... | @@ -154,7 +154,7 @@ class DerivedClass : BaseClass |
... | @@ -154,7 +154,7 @@ class DerivedClass : BaseClass |
|
#### **Method Override**
|
|
#### **Method Override**
|
|
**Method Override**는 *기반 클래스*의 Method를 *파생 클래스*에 적합한 Method로 재정의하는 것이다. *기반 클래스*의 Method를 *가상 Method*로 정의하기 위해 `virtual` 키워드를 사용한다. *파생 클래스*에서 *Virtual Method*와 같은 형태로 Method를 선언한 후 `override` 키워드를 사용하면 Method를 재정의할 수 있다.
|
|
**Method Override**는 *기반 클래스*의 Method를 *파생 클래스*에 적합한 Method로 재정의하는 것이다. *기반 클래스*의 Method를 *가상 Method*로 정의하기 위해 `virtual` 키워드를 사용한다. *파생 클래스*에서 *Virtual Method*와 같은 형태로 Method를 선언한 후 `override` 키워드를 사용하면 Method를 재정의할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class BaseClass
|
|
class BaseClass
|
|
{
|
|
{
|
|
public virtual void printClassInfo() // Virtual Method
|
|
public virtual void printClassInfo() // Virtual Method
|
... | @@ -171,7 +171,7 @@ class DerivedClass : BaseClass |
... | @@ -171,7 +171,7 @@ class DerivedClass : BaseClass |
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
BaseClass b = new BaseClass();
|
|
BaseClass b = new BaseClass();
|
|
BaseClass d = new DerivedClass();
|
|
BaseClass d = new DerivedClass();
|
|
|
|
|
... | @@ -183,7 +183,7 @@ d.printClassinfo(); // 출력 결과 : Derived Class |
... | @@ -183,7 +183,7 @@ d.printClassinfo(); // 출력 결과 : Derived Class |
|
|
|
|
|
> 현재 멤버가 해당 구현을 재정의하도록 하려면 override 키워드를 추가하십시오. 그렇지 않으면 new 키워드를 추가하십시오.
|
|
> 현재 멤버가 해당 구현을 재정의하도록 하려면 override 키워드를 추가하십시오. 그렇지 않으면 new 키워드를 추가하십시오.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class DerivedClass : BaseClass
|
|
class DerivedClass : BaseClass
|
|
{
|
|
{
|
|
public new void printClassInfo()
|
|
public new void printClassInfo()
|
... | @@ -195,7 +195,7 @@ class DerivedClass : BaseClass |
... | @@ -195,7 +195,7 @@ class DerivedClass : BaseClass |
|
|
|
|
|
* **Property**로 정의된 Method도 `override` 키워드를 사용해 재정의할 수 있다.
|
|
* **Property**로 정의된 Method도 `override` 키워드를 사용해 재정의할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Item
|
|
class Item
|
|
{
|
|
{
|
|
private int _price;
|
|
private int _price;
|
... | @@ -216,7 +216,7 @@ class UsedItem : Item |
... | @@ -216,7 +216,7 @@ class UsedItem : Item |
|
|
|
|
|
* .Net Framework의 모든 객체는 `Object`라는 기본 클래스를 상속받는다. `Object`에 기본적으로 포함된 Method도 **Override**를 할 수 있다.
|
|
* .Net Framework의 모든 객체는 `Object`라는 기본 클래스를 상속받는다. `Object`에 기본적으로 포함된 Method도 **Override**를 할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class MyClass
|
|
class MyClass
|
|
{
|
|
{
|
|
public override string ToString() // Object.ToString() Override
|
|
public override string ToString() // Object.ToString() Override
|
... | @@ -229,7 +229,7 @@ class MyClass |
... | @@ -229,7 +229,7 @@ class MyClass |
|
#### **Method Overload**
|
|
#### **Method Overload**
|
|
* **Method Overload**는 이름만 같은 Method가 매개변수의 개수와 형식만 다르게 선언하여 다중 정의(Overloading)한 것이다.
|
|
* **Method Overload**는 이름만 같은 Method가 매개변수의 개수와 형식만 다르게 선언하여 다중 정의(Overloading)한 것이다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Mathematics
|
|
class Mathematics
|
|
{
|
|
{
|
|
public int Add(int value)
|
|
public int Add(int value)
|
... | @@ -252,7 +252,7 @@ class Mathematics |
... | @@ -252,7 +252,7 @@ class Mathematics |
|
#### **Abstract 클래스**
|
|
#### **Abstract 클래스**
|
|
**Abstract 클래스**는 *Abstract Method*가 존재하는 클래스다. *Abstract Method*는 *파생 클래스*에서 반드시 재정의되어야 한다. **Abstract 클래스**의 모든 멤버가 **Abstract Method**로 정의되어 있으면 **인터페이스**와 같은 역할을 한다.
|
|
**Abstract 클래스**는 *Abstract Method*가 존재하는 클래스다. *Abstract Method*는 *파생 클래스*에서 반드시 재정의되어야 한다. **Abstract 클래스**의 모든 멤버가 **Abstract Method**로 정의되어 있으면 **인터페이스**와 같은 역할을 한다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
abstract class AbstractClass
|
|
abstract class AbstractClass
|
|
{
|
|
{
|
|
private string _name;
|
|
private string _name;
|
... | @@ -281,7 +281,7 @@ class MyClass : AbstractClass |
... | @@ -281,7 +281,7 @@ class MyClass : AbstractClass |
|
|
|
|
|
* `get`과 `set` 접근자를 사용하여 **Property**를 사용할 수 있다. `set` 접근자는 매개변수 대신에 `value` 키워드를 사용한다.
|
|
* `get`과 `set` 접근자를 사용하여 **Property**를 사용할 수 있다. `set` 접근자는 매개변수 대신에 `value` 키워드를 사용한다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Person
|
|
class Person
|
|
{
|
|
{
|
|
private string _name;
|
|
private string _name;
|
... | @@ -292,15 +292,15 @@ class Person |
... | @@ -292,15 +292,15 @@ class Person |
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
Person person;
|
|
Person person;
|
|
person.age = "김선욱";
|
|
person.name = "Novo";
|
|
Console.WriteLine(person.name); // 출력 결과 : 김선욱
|
|
Console.WriteLine(person.name); // 출력 결과 : Novo
|
|
```
|
|
```
|
|
|
|
|
|
* C# 3.0부터는 **자동구현 Property**를 제공하여 더 간결하게 정의할 수 있다.
|
|
* C# 3.0부터는 **자동구현 Property**를 제공하여 더 간결하게 정의할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
class Person
|
|
class Person
|
|
{
|
|
{
|
|
public string name { get; private set; } // 접근 한정자 사용 가능
|
|
public string name { get; private set; } // 접근 한정자 사용 가능
|
... | @@ -311,21 +311,21 @@ class Person |
... | @@ -311,21 +311,21 @@ class Person |
|
#### **Partial Type**
|
|
#### **Partial Type**
|
|
**Partial Type**을 사용하여 **클래스**, **구조체** 또는 **인터페이스**의 내용을 여러 개로 나누어 정의할 수 있다. 객체를 구현 할 때 역할에 따라 여러 파일로 나누어 분담할 수 있다.
|
|
**Partial Type**을 사용하여 **클래스**, **구조체** 또는 **인터페이스**의 내용을 여러 개로 나누어 정의할 수 있다. 객체를 구현 할 때 역할에 따라 여러 파일로 나누어 분담할 수 있다.
|
|
|
|
|
|
```javascript
|
|
```
|
|
// Project.model.cs
|
|
// Project.model.cs
|
|
partial class Project
|
|
partial class Project
|
|
{
|
|
{
|
|
public void Model();
|
|
public void Model();
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
// Project.view.cs
|
|
// Project.view.cs
|
|
partial class Project
|
|
partial class Project
|
|
{
|
|
{
|
|
public void View();
|
|
public void View();
|
|
}
|
|
}
|
|
```
|
|
```
|
|
```javascript
|
|
```
|
|
// Project.controller.cs
|
|
// Project.controller.cs
|
|
public partial class Project
|
|
public partial class Project
|
|
{
|
|
{
|
... | | ... | |