new 예약어
-
때로 자식 클래스에서 다형성 차원에서가 아닌 순수하게 독립적인 하나의 메서드로 이름을 정의하고 싶은 경우, C#에서는 같은 이름의 메서드를
일부러 겹쳐서 정의했다는 개발자의 의도를 명시적으로 표현할 수 있게 new예약어를 제공합니다.
1. 메서드
오버라이들 원할경우 virtual/override
2. 단지
자식클래스에 동일한 이름의 메서드가 필요한경우 new
연산자 오버로딩
1
2
3
4
|
public static 타입 operator 연산자 (타입1 변수명1, 타입2 변수명2)
{
// 타입을 반환하는 코드
}
| cs |
* 단항 :
피연산자가 하나라는 의미 , a= -2에서 - 음수를 나타내는 부호 연산자는 우측에 숫자 하나만 필요
* 이항 :
피연산자가 두개라는 의미 , a = 1 - 2에서 - 는 연산자의 좌측과 우측에 각각 하나씩 피연산자가 필요
대입 연산자 오버로딩
-
C#에서는 = 대입 연산자를 허용하지 않기때문에 대체 구문으로 explicit,
implicit 메서드를 정의하는 것으로 동일한 목적을 달성할 수 있습니다.
1
2
3
4
5
|
static public implicit operator 타입1(타입2 변수명2)
{
// 타입1을 반환하는 코드
}
| cs |
- implicit
operator를 오버로드 했으므로 암시적 형변환을 할 수 있고, 암시적 형변환이 가능하므로 명시적 캐스팅 연산자를 쓰는 것도
허용됩니다.
1
2
3
4
5
|
static public explicit operator 타입1(타입2 변수명2)
{
// 타입1을 반환하는 코드
}
| cs |
* explicit은 명시적 형변환만 가능하도록 허용하는 연산자입니다.
ex)
타입2 변수명2
= new 타입2;
- 타입1
변수명1 = (타입1)변수명2; <- 명시적
- 타입1
변수명1 = 변수명2 <- 암시적
람다식
- 람다식은
익명 메소드를 만들기 위해 사용합니다. 람다식으로 만드는 익명 메소드는 무명함수라는 이름으로 부릅니다.
메소드는 입력(매개변수)과 출력(리턴)을 가지고 있듯이 람다식도 마찬가지입니다.
1
2
|
delegate int Calculate(int a, int b);
| cs |
-
익명 메소드를 만들려면 델리게이트가 필요합니다.
1
2
3
4
5
|
static void Main(string[] args)
{
Calculate calc = (int a, int b) => a + b;
}
| cs |
-
두개의 int 형식 매개 변수 a,b를 받아 이 둘을 더해 반환하는 익명 메소드를 람다식으로 만들었습니다.
* Func와 Action으로 더 간편하게 무명 함수 만들기
대부분의 경우 단
하나의 익명 메소드나 무명 함수를 만들기 위해 매번 별개의 델리게이트를 선언해야 합니다.
이를 위해 NET
프레임워크에 Func와 Action 델리게이트를 미리 선언해 뒀습니다.
-
Func : .NET Framework에는 총 17가지의 Func 델리게이트가 준비되어 있으며, 즉 매개변수가 없는 메소드부터 매개변수가
16개인 메소드까지 총 17개의 메소드를 참조 할 수 있습니다.
1
2
3
4
5
6
|
Func<float> func1 = () => 0.1f;
Func<int,float> func2 = (a) => a*0.1f;
Func<int,int,float> func3 = (a,b) => (a+b) * 0.1f;
| cs |
-
Action : Action 델리게이트는 Func와 똑같으나, 참조하는 메소드의 반환값이 없을 뿐입니다.
중첩 클래스
-
클래스 내부에 또 다른 클래스를 정의하는 것입니다.
추상 클래스
-
부모 클래스의 인스턴스를 생성하지 못하게 하면서 특정 메서드에 대해 자식들이 반드시 재정의하도록 강제하고 싶은 경우 사용되며
abstract 예약어로 지정해야합니다.
일반 클래스와의 차이점
1. new를
사용해 인스턴스로 만들 수 없습니다.
2. 추상
메서드를 가질 수 있습니다.
1
2
3
4
5
|
abstract class 타입1
{
public abstract void 메소드1();
}
| cs |
인터페이스 ( interface )
-
인터페이스는 간단하게 계약이라고 정의되며, 구현없이 메서드 선어난 포함된 클래스 문법과 비슷합니다. 추상 메서드를 0개 이상 담고 있는 추상
클래스라고 생각해도 무방하며, 프로퍼티(변수) 역시 포함할 수 있습니다.
1
2
3
4
5
|
접근_제한자 interface 인터페이스_명
{
// 메서드 선언
}
| cs |
interface를 사용하는 이유
- 클래스는
다중상속이 불가능 하지만 인터페이스는 다중 상속이 허용되기때문에 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Computer
{
}
interface IMonitor
{
void TurnOn();
}
interface IKeyboard { }
class NoteBook : Computer, IMonitor, IKeyboard
{
public void TurnOn();
void IMonitor.TurnOn();
}
| cs |
[ 사용법 ]
1.
인터페이스의 메서드를 자식 클래스에서 구현할 때는 반드시 public 접근 제한자를 명시해야합니다.
2.
아니면 인터페이스 명을 직접 붙이는 경우 public 접근 제한자를 생략해도 됩니다. public을 생략해서 private이 되는것은
아닙니다.
-
이방법으로 선언시 함수호출할때는 인터페이스로 형변환 후 호출해야합니다!
* 인터페이스에
속한 메서드는 모두 가상 메서드에 속합니다. C#컴파일러가 인터페이스의 메서드를 가상 메서드로 간주하기 때문에 virtual예약어를 일부러
지정하지 못하게 막고 있답니다. 아울러 상속받은 자식 클래스에서도 override예약어를 지정하지 못합니다.
* 인터페이스의
메서드는 가상 메서드이기 때문에 다형성의 특징이 적용된다.