English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#面向对象(OOP)
인간 세계에서, 두人或 그 이상의 사람들 간의 계약은 계약에 따라 행동하게 합니다. 마찬가지로, 인터페이스는 관련 기능의 선언을 포함합니다. 인터페이스를 구현하는 실체는 선언된 기능의 구현을 제공해야 합니다。
다음 인터페이스는 파일操作의 일부 기본 기능을 선언합니다。
interface IFile { void ReadFile(); void WriteFile(string text); }
접근修饰符는 인터페이스 멤버에 적용할 수 없습니다. 기본적으로 모든 멤버는 공개입니다. 인터페이스에서 접근修饰符를 사용하면 C# 컴파일러는 컴파일 시간 오류 “The modifier 'public'를 반환합니다。/private/protected'는 이 항목에 대해 유효하지 않습니다.”。(Visual Studio는 즉시 오류를 표시하고 컴파일하지 않습니다。)
interface IFile { protected void ReadFile(); //컴파일 시 오류 private void WriteFile(string text);//컴파일 시 오류 }
인터페이스는 구현을 포함할 수 없으며, 대신声明만 포함해야 합니다. 이는 컴파일 시 오류를 발생시킵니다.
interface IFile { void ReadFile(); void WriteFile(string text){ Console.Write(text); //에러: 메서드 구현 불가 } }
클래스나 Struct는 冒号(:)를 사용하여 하나 이상의 인터페이스를 구현할 수 있습니다.
문법:
<Class or Struct Name> : <Interface Name>
예를 들어, 다음 클래스는 IFile 인터페이스를 은밀하게 구현합니다.
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { public void ReadFile() { Console.WriteLine("Reading File") } public void WriteFile(string text) { Console.WriteLine("파일에 쓰는 중"); } }
위 예제에서 FileInfo 클래스는 IFile 인터페이스를 구현했습니다. 그것은 public 접근수식자로 IFile 인터페이스의 모든 멤버를 정의합니다. FileInfo 클래스는 인터페이스 멤버 이외의 다른 멤버도 포함할 수 있습니다.
인터페이스 멤버는 public 수식자로 구현되어야 합니다. 그렇지 않으면 컴파일러는 컴파일 시 오류를 발생시킵니다.
다음과 같이 클래스의 객체를 생성하고 인터페이스 타입 변수에 할당할 수 있습니다.
public class Program { public static void Main() { IFile file1 = new FileInfo(); FileInfo file2 = new FileInfo(); file1.ReadFile(); file1.WriteFile("내용"); file2.ReadFile(); file2.WriteFile("내용"); } }
위에서 FileInfo 클래스의 객체를 생성하고 그것을 IFile 타입 변수와 FileInfo 타입 변수에 할당했습니다. 인터페이스가 은밀하게 구현될 때, IFile 타입 변수와 FileInfo 타입 변수를 사용하여 IFile 멤버에 접근할 수 있습니다.
인터페이스는 <InterfaceName>.<MemberName>를 사용하여 명시적으로 구현할 수 있습니다. 클래스가 여러 인터페이스를 구현하고 있을 때 명시적 구현은 유용합니다. 따라서 읽기 쉽고 혼란을 줄입니다. 인터페이스가 같은 메서드 이름을 가질 때도 유용합니다.
다음과 같이 하지 마세요 public 수식자는 명시적 구현과 함께 사용됩니다. 이는 컴파일 시 오류를 발생시킵니다.
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { void IFile.ReadFile() { Console.WriteLine("Reading File") } void IFile.WriteFile(string text) { Console.WriteLine("파일에 쓰는 중"); } }
인터페이스를 명시적으로 구현할 때는 인터페이스 타입의 인스턴스를 통해 인터페이스 멤버에 접근할 수 있습니다.
interface IFile { void ReadFile(); void WriteFile(string text); } class FileInfo : IFile { void IFile.ReadFile() { Console.WriteLine("Reading File") } void IFile.WriteFile(string text) { Console.WriteLine("파일에 쓰는 중"); } public void Search(string text) { Console.WriteLine("파일에서 검색 중"); } } public class Program { public static void Main() { IFile file1 = new FileInfo(); FileInfo file2 = new FileInfo(); file1.ReadFile(); file1.WriteFile("내용"); //file1.Search("검색할 텍스트")//컴파일 시 오류 file2.Search("검색할 텍스트"); //file2.ReadFile(); //컴파일 시 오류 //file2.WriteFile("내용"); //컴파일 시 오류 } }
위의 예제에서 file1객체가 접근할 수 있는 멤버 IFile과 file2FileInfo 클래스의 멤버에 접근할 수 있습니다. 이는 명시적 구현의 한계입니다.
클래스나 구조체는 여러 인터페이스를 구현할 수 있습니다. 모든 인터페이스의 모든 멤버를 구현해야 합니다.
interface IFile { void ReadFile(); } interface IBinaryFile { void OpenBinaryFile(); void ReadFile(); } class FileInfo : IFile, IBinaryFile { void IFile.ReadFile() { Console.WriteLine("텍스트 파일을 읽고 있습니다"); } void IBinaryFile.OpenBinaryFile() { Console.WriteLine("바이너리 파일을 열고 있습니다"); } void IBinaryFile.ReadFile() { Console.WriteLine("바이너리 파일을 읽고 있습니다"); } public void Search(string text) { Console.WriteLine("파일에서 검색 중"); } } public class Program { public static void Main() { IFile file1 = new FileInfo(); IBinaryFile file2 = new FileInfo(); FileInfo file3 = new FileInfo(); file1.ReadFile(); //file1.OpenBinaryFile(); //컴파일 시 오류 //file1.SearchFile("검색할 텍스트"); //컴파일 시 오류 file2.OpenBinaryFile(); file2.ReadFile(); //file2.SearchFile("검색할 텍스트"); //컴파일 시 오류 file3.Search("검색할 텍스트"); //file3.ReadFile(); //컴파일 시 오류 //file3.OpenBinaryFile(); //컴파일 시 오류 } }
위에서, FileInfo는 두 개의 인터페이스, IFile과 IBinaryFile을 명시적으로 구현했습니다. 여러 인터페이스를 구현할 때 명시적으로 인터페이스를 구현하면 혼란을 피하고 가독성을 높일 것을 권장합니다.
인터페이스는 메서드, 속성, 인덱서 및 이벤트의 선언을 포함할 수 있습니다。
인터페이스는 프라이빗 멤버, 프로텍션 멤버 또는 인내 멤버를 포함할 수 없습니다. 기본적으로 모든 멤버는 공개됩니다。
인터페이스는 필드와 자동 구현된 속성을 포함할 수 없습니다。
클래스나 구조체는 익명으로 하나나 여러 개의 인터페이스를 구현할 수 있습니다. 익명으로 인터페이스를 구현할 때는 public 접근 지정자를 사용하며, 명시적으로 구현할 때는 사용하지 마십시오。
인터페이스를 명시적으로 구현하려면 InterfaceName. MemberName을 사용합니다。
한 인터페이스는 하나나 여러 개의 인터페이스를 상속할 수 있습니다。