Post List

2018/01/04

C# __6.0 인터페이스(interface)

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예약어를 지정하지 못합니다.

* 인터페이스의 메서드는 가상 메서드이기 때문에 다형성의 특징이 적용된다.