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