C# 인터페이스
- 인터페이스는 메서드, 속성(Property), 이벤트, 인덱서만을 가질 수 있으며, 이를 직접 구현하지 않는다.
- 인터페이스는 필드를 포함할 수 없다.
- 정의부분만 표현하고, 구현 부분은 상속받은 클래스에서 구현한다. (구현이라 함은 {}가 포함된 거)
- 인터페이스는 추상 멤버(abstract member)로만 구성된 추상 Base 클래스(abstract base class)와 개념적으로 유사하다.
- 클래스가 인터페이스를 가지는 경우 해당 인터페이스의 모든 멤버에 대한 구현(implementation)을 제공해야 한다.
- C# 클래스가 인터페이스를 갖는 경우 인터페이스의 모든 멤버에 대한 구현을 제공해야 한다.
- 여러개의 인터페이스를 부모로 둘 수 있다. (다중 상속 가능)
- 인터페이스로 객체를 생성할 수는 없다.
참고사항
public class Staff : IEmployee
를 보면 C#은 상속이 Class 인지, Interface 인지 구별없이 사용한다.
Java 는 Class 상속은 extends, Interface 구현은 implements 로 구별하고 있다.
그래서 C#에서는 인터페이스라는 걸 구별하기 위해 암묵적으로 대문자 I를 붙여주는 거 같다.
예제 1
using System;
namespace Interface_01 { interface IEmployee { // 멤버 앞에 접근제한자 사용 안함 string getName(); void setName(string n); int getCounter(); }
public class Staff : IEmployee { // IEmployee 구현, 인터페이스라는 걸 구분하기 위해서 앞에 대문자 I를 붙인다. private String name; private int counter; public static int NOofEmployees;
public string getName() { return name; }
public void setName(string name) { this.name = name; }
public int getCounter() { return counter; }
public Staff() // 생성자 { counter = ++counter + NOofEmployees; } }
class Program { static void Main(string[] args) { string name; Console.Write("직원 수 입력: "); Staff.NOofEmployees = int.Parse(Console.ReadLine());
Staff my = new Staff(); Console.Write("신입 직원의 이름을 입력하세요: "); name = Console.ReadLine(); my.setName(name);
Console.WriteLine("▷ 직원 정보 ◁"); Console.WriteLine("직원 번호 : {0}, 직원이름 : {1} : ", my.getCounter(),my.getName()); } } }
|
예제2 : 프로퍼티 속성을 이용한 인터페이스 구현
using System;
namespace Interface_02 { interface IEmployee { // 멤버 앞에 접근제한자 사용 안함 string Name { get;set; } // 읽기, 쓰기 모두 가능한 프로퍼티 int Counter { get; } // 읽기 전용 프로퍼티 }
public class Staff : IEmployee { // IEmployee 구현, 인터페이스라는 걸 구분하기 위해서 앞에 대문자 I를 붙인다. private String name; private int counter; public static int NOofEmployees; // static 키워드를 사용해서 객체 생성없이 필드 사용
public string Name // 읽기, 쓰기 모두 가능한 프로퍼티 { get { return name; } set { name = value; } }
public int Counter // 읽기 전용 프로퍼티 { get { return counter; } }
public Staff() // 생성자 { counter = ++counter + NOofEmployees; } }
class Program { static void Main(string[] args) { string name; Console.Write("직원 수 입력: "); Staff.NOofEmployees = int.Parse(Console.ReadLine());
Staff my = new Staff(); Console.Write("신입 직원의 이름을 입력하세요: "); name = Console.ReadLine(); my.Name = name;
Console.WriteLine("▷ 직원 정보 ◁"); Console.WriteLine("직원 번호 : {0}, 직원이름 : {1} : ", my.Counter, my.Name);
} } }
|
Base()
this는 각각의 메모리를 구분하기위한 방법이며, 생성자를 호출하기 위한 방법으로 사용된다.
이외에 부모와 자식간의 메모리를 구분하기 위한 키워드가 바로 base키워드이다.
부모 클래스의 이름으로는 부모 클래스의 생성자를 호출할 수 없고 base 키워드를 사용해야 한다.
public class Parent { private int i;
public Parent(int i) { this.i = i; } }
public class Child : Parent { private int j;
public Child(int i, int j) : base(i) // 부모 클래스의 생성자를 호출하려면 base 키워드를 사용해야 한다. { this.j = j; } } |
Program.cs