IDictionary VS Dictionary 차이점이 뭔가요?

이게 c 계열 언어의 상속과 비슷한 문법을 쓰기 때문에
처음 배울 때 오해를 많이 하게 되는데,

인터페이스는 상속하고는 관련이 없어요. 상속은 클래스에서만 사용합니다.

대신 인터페이스는 일종의 계약서 라고 보시면 됩니다.
타입을 사용하는 구조에서 인터페이스는,
‘반드시 여기 정의된 것을 구현하라!’ 라는 의미를 지닌 계약서라고 보면 됩니다.

이 계약은 클래스 뿐만 아니라 다른 구조체에도 적용될 수 있습니다.

따라서 이 계약서를 구현하는 타입은
모두 해당 인터페이스 타입으로 간주하겠다. 라는 의미와도 같다고 보면 됩니다.

이런 예시를 드셨는데,
이걸 이렇게 쪼개서 보자면

IDictionary<string, string> data;
data = new Dictionary<string, string>();

이건 당연히 가능하겠죠? 왜냐하면 Dictionary<, >IDictionary<,> 를 구현하고 있으니까요.

여기에 만약 CustomDictionary<,> 라는 녀석이 있다 치고
이 녀석이 IDictionary<,> 를 구현하고 있다면

IDictionary<string, string> data;
data = new CustomDictionary<string, string>();

이것도 가능하다는 얘기입니다.
왜냐하면 IDictionary<,> 라는 인터페이스를 구현했다면 같은 타입으로 인정하게 되니까요.

만약 data 의 선언을

Dictionary<string, string> data;

이렇게 해버리면, 이 data는 죽었다 깨어나도 Dictionary<string, string> 만 할당할 수 있어요.
(물론 Dictionary<,> 에서 파생된 객체는 할당할 수 있지만서도…)

하지만 이렇게 인터페이스로 타입을 선언하면,
해당 인터페이스를 구현한 어떠한 타입이라도 할당할 수 있습니다.

상황에 따라서 여러 종류의 타입을 담을 수 있게 되는 거죠.
(당연하지만 한 번 한 개의 인스턴스만 담을 수 있어요. 오해 ㄴㄴ)

이런식으로 다형성을 지원하는 게 인터페이스의 핵심이에요.

10개의 좋아요