8. Interface

* 왜 쓰는지를 궁금해하는 사람이 많다면, "왜 잘못 사용되고 있는지", "어떻게 하면 제대로 사용될지"를 고민할 것

No. Cat. Class Abstract Class Interface
1 목적 OOP 직접 인스턴싱 금지
추상 매서드 오버라이딩 필수
동일한 메서드를 가진 객체 보장
다중 상속
2 기본 한정자 private private (추상 메서드: public) public
3 인스턴싱 O X X
4 구현부 O (필수) O (선택) X (기본 구현체 예외)
5 중첩 상속 O (클래스 > 클래스) O (추상 클래스 > 추상 클래스) O (인터페이스 > 인터페이스)
6 다중 상속 X (Containment) X O (중복될 구현부가 없다)
7 참조형 선언 O (Object obj;) O (AbstractClass abs;) O (Interface inter;)
8 다형성 O O O
9 특징     인터페이스, 구조체, 클래스간 상속

- 인터페이스를 상속하는 인터페이스

: 상속하려는 인터페이스가 소스 코드가 아닌 어셈블리로만 제공되는 경우: .NET SDK에서 제공하는 인터페이스

: 상속하려는 인터페이스의 소스 코드를 갖고 있어도 이미 인터페이스를 상속하는 클래스들이 존재하는 경우

 

- 다중 상속 문제

: 클래스의 다중 상속시 중복되는 메서드 식별 문제 발생

: 인터페이스의 다중 상속시, 구현 단일화로 식별 가능

: 클래스 다중 상속 우회 방법, 실행 코드를 함수 구현부에서 실행

 

- 인터페이스 기본 구현 메서드 (+ 레거시)

: 인터페이스에 새로운 메서드 원형을 추가한다면, 모든 파생 클래스에 코드를 구현해야 한다.

: 새로운 메서드 원형에 기본적인 구현체를 선언해 우회한다.

: 인터페이스에 선언된 기본 구현 메서드는 파생 클래스의 참조로 호출할 수 없다

: 기본 구현 메서드는 오버라이딩 하지 않는다면, 상속받은 클래스에서 인터페이스 기본 구현 메서드를 사용 할 수 없다.

9. Property

* 목적: 은닉성(encapsulation) + 편의성

9.1. property

: private + Getter/Setter accessor(접근자) 메소드를 property 대체하고 손쉽게 사용

9.2. 프로퍼티와 생성자

: 생성자에 초기화 코드 구현 대체

 

9.3. 초기화 전용(Init-Only) 자동 구현 프로퍼티

: 필요한 프로퍼티만 초기화

 

 

9.4. Record

* 참조 형식의 비용 효율과 값 형식이 주는 편리함을 모두 제공

  값 형식 참조 형식 Record
복사 깊은 복사 얇은 복사 깊은 복사
복사 방법 할당 연산자 모든 필드 복사 구현 할당 연산자
비교 방법 모든 요소 1:1 비교 구현 object.equal() 구현 1:1
복사 비용 높음 낮음 낮음

 

- with 레코드 객체 비교

* 컴파일러는 레코드의 상태를 비교하는 Equals ( ) 메소드를 자동으로 구현

9.5. Anonymous Type (무명 형식)

무명 형식은 형식의 선언과 동시에 인스턴스를 할당합니다.

인스턴스를 만들고 다시는 사용하지 않을 때

선언시 할당된 값은 변경 불가

LINQ 와 연동

 

 

9.6. 인터페이스와 프로퍼티

* 인터페이스의 프로퍼티 선언은 클래스의 자동 구현 프로퍼티 선언과 그 모습이 동일

 

9.7. 추상 클래스와 프로퍼티

: 추상 프로퍼티 Abstract Property

ubiquitous4g