[C#] 키워드들 interface,

## 개요

오랜만에 닷넷과 C# 개발로 돌아와서 예전에 공부했던 내용이 명확하지 않아서 프로그램을 설계할 때 다시 주요 키워드를 정리해보려고 합니다.

(키워드: 컴파일러 정보를 위해 사전 정의된 예약 식별자)

## 액세스 수정자

– 공개: 접근 제한 없음

– protected: 파생 유형에 대해서만 액세스 가능

– 내부: 현재 어셈블리에서만 액세스 가능

– private: 현재 타입에서만 접근 가능

– 개인적으로 protected internal이나 private protected는 안쓰고 가독성이 떨어지는 것 같아서 패스하겠습니다.

액세스 한정자를 기본값보다 명시적으로 선언하는 것이 더 좋으며 좁은 범위에서 선언하는 것이 안전합니다.

한 번 비공개로 선언하고 외부 공개가 필요하다고 판단되면 내부로 변경됩니다.

내부의 경우 같은 어셈블리 내에서는 공용처럼 사용되지만 외부 어셈블리에서는 전용입니다.

어셈블리에 대한 클래스 액세스 제한의 범위를 확장하고 이해하면 되며 모듈 종속성을 관리하는 것이 좋습니다.

내부에서 공개로 이동할 때가 되면 디자인을 재고할 기회가 생깁니다.

파생 클래스 설계는 private > (protected internal) > protected > internal > public 순으로 변경이 필요한 경우에도 확장됩니다.

## 매개변수, 입력, 출력, 참조

메소드 매개변수의 속성 선언을 위한 키워드

### 인수 및 매개변수

– 인수: 함수 호출자가 함수에 전달한 값입니다.

– 매개변수: 함수 정의에서 받은 인자를 함수 내부로 넘기기 위해 사용하는 변수.

### 참조 유형 및 값 유형

– 참조 유형

– 수업

Pass-by-reference는 변수에 대한 메서드입니다.

입장중재하다

– 값 유형

-구조

– 값에 의한 전달은 메서드의 변수입니다.

복사중재하다

### 키워드별 기능

-매개변수

– 가변 길이 매개변수 선언

– 매개변수 배열은 1차원 배열이어야 합니다(예: `params int() list`, `params object() list`).

– 오버로딩은 일반적인 경우에 사용하고, 길이 제한이 없고 같은 타입의 파라미터가 필요한 경우에 사용합니다.

-ref

– 메서드 매개변수가 참조임을 선언합니다.

(반드시 초기화 후 인자로 할당받아야 합격)

– 값 유형을 참조 유형으로 전달하는 데 유용합니다.

-안에

– ref와 유사하지만 메소드 매개변수가 읽기 전용임을 선언합니다.

– 즉, 메소드 내에서 매개변수 값을 변경할 수 없습니다(인수로 전달하기 전에 지정해야 함).

매개 변수 한정자와 일반 한정자의 차이점에 유의하십시오(일반 한정자로 사용되는 경우 금기 사항 제공).

– 예: 액션-정의: `공개 대리인 무효 조치(Tobj);`

– 전달된 매개변수의 복사본을 만들지 않고 참조로 큰 개체(예: 값 유형 구조)를 전달하는 데 유용합니다.

-에서

– ref와 유사하지만 메소드 매개변수를 작성해야 함을 선언합니다.

– 즉, 매개변수의 값은 메소드에 의해 할당되어야 함을 선언합니다.

(메서드 내에서 매개변수 초기화 및 할당 적용)

매개 변수 한정자와 일반 한정자(일반 한정자로 사용되는 경우 공변량 지정) 사이의 차이점에 유의하십시오.

– 예: IEnumerable 정의: `공개 인터페이스 IEnumerable :IEnumerable`

– 예: Func의 정의: `Public Delegate TResult 기능();`

– 메서드가 여러 값을 반환할 때 유용합니다.

### 공변 및 반변

– 참고 문헌의 링크를 참조하십시오

## 요약 및 인터페이스

abstract는 범위를 변경하는 한정자 키워드로 인스턴스화되지 않고 다른 클래스의 기본 클래스로만 사용됨을 나타내며 interface는 클래스와 같은 유형을 나타내는 키워드입니다.

즉 Abstract는 파생할 객체의 속성을 나타내는 기본 클래스를 정의할 때 사용하고 Interface는 이를 구현하기 위해 클래스나 구조체와 같은 객체를 정의할 때 사용합니다.

행동유형을 정의할 때 사용합니다.

클래스는 객체의 속성과 동작의 집합이며, 해당 객체의 공통된 추상 개념 집합을 재사용하기 위해 묶을 때 추상을 기본 클래스로 정의합니다.

이름에서 알 수 있듯이 추상 개체이므로 인스턴스화되지 않고 파생 클래스에 의해 인스턴스화(입증)될 뿐입니다.

반면에 인터페이스는 개체가 가져야 하는 속성 및 동작의 계약상 집합으로 생각할 수 있습니다.

상속이 “켜짐”이면 컴포지션이 인터페이스 전체에서 “유사하게” 작동합니다.

간단한 예로

인간, 새, 고래와 같은 동물의 일반적인 동작 속성은 Animal 클래스의 Move()로 정의할 수 있습니다.

동물은 구체화할 수 없는 추상적인 개념이기 때문에 추상적이라고 선언한다.

인간은 생각할 수 있고(동물도 할 수 있지만 극복해 봅시다) 새는 날 수 있고 돌고래는 잠수할 수 있습니다.

이들은 일반적인 특성이 아니므로 각각 IThinkable, IFlyable 및 IDiveable과 같은 인터페이스로 선언하고 각각에 대해 Think(), Fly() 및 Dive()와 같은 작업을 정의할 수 있습니다.

나중에 흰색, 검은색, 독수리, 참새, 돌고래, 범고래 등의 개체로 파생되더라도 그 특성과 행동에 따라 확장될 수 있다.


위는 예시일 뿐이며, Move()와 같은 일반적인 연산을 인터페이스하고 Abstract를 통해 Animal의 공통된 특성만 정의하는 것이 좋습니다.

전통적으로 OOP에서는 상속보다는 합성을 통한 느슨한 결합을 통해 유연성을 추구했고, 이 때문에 추상적인 것보다 인터페이스를 사용하는 경우가 많다.

상속을 무조건적으로 사용해서는 안된다는 말이 아닙니다.

변경 가능성이 없는 프로그램의 뼈대를 구성하는 기능에 대해서는 기본 클래스를 통한 상속을 사용하고 변경이 예상되는 나머지 부분에 대해서는 구성을 적절하게 사용합니다.

## 추상 및 가상

virtual은 파생 클래스에서 메서드, 속성, 인덱서 또는 이벤트 선언을 재정의할 수 있음을 선언합니다.

추상과의 차이점은 추상 구현은 파생 클래스에서만 정의할 수 있지만 가상은 선언 시 정의할 수 있다는 것입니다.

말 그대로 abstract는 추상적이고 실체가 없으므로 구현이 없고, virtual(가상)은 ‘거의 완전히’라는 의미를 가지므로 ‘어느 정도 구현된다’는 뜻이므로 구현이 있다.

IT쪽은 영어권 국가가 아니라서 한국어로 번역되는 경우가 많고 뜻이 제대로 전달되지 않아 손해를 보는 경우가 많습니다.

재정의된 함수와 함께 “다소 구현된” 기본 클래스의 기능만 사용할지 또는 재정의된 함수만 사용할지는 파생 클래스에서 프로그래밍하여 결정할 수 있습니다.

## 덮어쓰기 및 봉인

seal은 상속되지 않음을 선언하는 키워드입니다.

상속을 계획하지 않는 일반 클래스에서 선언하고 상속이 필요할 때 해제하면 설계에 신경을 쓸 수 있고 상속이 없는 상태에서 다른 사람이 파생시켜 사용하는 것을 방지하는 것이 좋다.

파생 디자인. 저는 개인적으로 클래스를 선언할 때 항상 내부 인감부터 시작합니다.

반면에 override는 상속된 파생 클래스에서 사용되는 키워드입니다.

이것은 “들어가다, 우선권을 가지다, 재정의하다”라는 의미를 가지며 IT에서 “재정의하다”를 의미하는 데 사용됩니다.

(참고로 오버로딩은 오버로딩을 의미하며 같은 함수(이름)가 기대 이상이라는 뜻입니다.

) 함수를 오버라이딩하는 오버라이드 기법은 C#에서 override 키워드로 선언하고 메서드는 베이스 클래스에서 추상 또는 가상으로 정의합니다.

특성이 파생 클래스에서 재정의되고 있음을 컴파일러에 알립니다.

## 참조

– 나의 막연한 경험

– 효과적인 C# 예약 – Bill Wagner

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface

인터페이스 – C# 참조

interface 키워드를 사용하여 구현 유형이 지원해야 하는 계약을 정의합니다.

인터페이스는 독립 유형 집합 간에 공통 동작을 생성하는 수단을 제공합니다.

learn.microsoft.com

https://ibocon.91

(C#) 공분산 공분산 및 공분산 공분산

공분산 및 반공변성 Microsoft 공식 문서에는 공분산 및 반공변성의 개념이 소개되어 있지만 이해하기가 너무 어려웠습니다.

나에게 텍스트의 구조가 너무 어렵고 배경 설명

ibocon.tistory.com