[인터페이스]
1.설명
-인터페이스는 객체의 역할만을 정의한다.
-어떤 변수를 쓰는지, 어떤 메소드를 쓰는지만 써놓는다.
-객체가 수행해야하는 핵심적인 역할만을 규정해두고,
실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 한다.
- 인터페이스는 자신으로부터 파생될 클래스가 반드시 인터페이스의 메소드를 구현하도록 강제한다.
2. 선언 방법
interface 인터페이스 이름
{
반환형식 메소드이름 (매개변수 목록);
}
3.인터페이스 규칙
-인터페이스는 접근 제한 한정자를 사용할 수 없다. 모든 것을 Public 으로 구현해야한다.
-인터페이스는 인스턴스도 만들 수 없다
-인터페이스는 구현부가 없다
-인터페이스를 상속받은 클래스는 인터페이스에 선언된 모든 메소드 및
프로퍼티를 구현해야한다.
-인터페이스는 인터페이스가 상속할 수 있다.
-클래스에서 여러 인터페이스를 상속 받을 수 있다.
(단, 클래스는 여러 클래스를 한꺼번에 상속받을 수 없다)
-클래스의 이름은 앞에 I를 붙이는 것이 관례이다.
4.예제
1). 클래스와 인터페이스의 상속
interface ICar
{
void Drive(int speed);
}
class CarControl : ICar
{
public void Drive(int speed){
Console.WriteLine("Car Speed {0}",speed);
}
}
2). 인터페이스간의 상속
interface ICar {
void Drive(int speed); //A부분
}
interface ICarControl {
void Drive(int speed, string direction); //B부분
}
class CarControl : ICarControl{
public void Drive(int speed){
Console.WriteLine("Car Speed {0}",speed); // A부분
}
public void Drive(int speed, string direction){ //B부분
Console.WriteLine("Car Speed {0} Direction {1}",speed,Direction);
}
}
3). 인터페이스 다중 상속
interface IAnimal
{
void Eat();
}
interface IDog
{
void Bark();
}
class Dog : IAnimal, IDog //인터페이스를 사용한 다중 상속
{
public void Eat(){
Console.WriteLine("먹다.")
};
public void Bark(){
Console.WriteLine("짖다.")
};
}
class Program
{
static void Main()
{
Dog dog = new Dog();
dog.Eat(); //IAnimal 인터페이스 상속
dog.Bark(); //IDog 인터페이스 상속
}
}
4). 인터페이스의 참조 (중요)
인터페이스는 인스턴스를 만들 수 없다. 단, 인터페이스를 상속받는 클래스의 인스턴스를 만드는 것은 가능하다.
이를 이용해서 인터페이스가 인터페이스를 상속받는 클래스의 인스턴스를 참조 할 수 있다.
"인터페이스는 인스턴스는 못 만들지만 참조는 만들 수 있다. "
이 참조에 파생 클래스의 객체의 위치를 담는다.
class Logger : ILogger
{
public void WriteLog(string message)
{
Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
}
}
//Main 부
ILogger logger = new Logger();
logger.WriteLog("Hello World!");
ILogger logger는 인터페이스이고 new Logger()는 Logger라는 클래스의 객체의 위치이다.
"파생 클래스는 부모 클래스와 같은 형식으로 간주된다. "
"인터페이스와 인터페이스를 상속받은 클래스는 같은 형식이라고 볼 수 있다."
[추상 클래스]
1. 개념
-인터페이스와 클래스 사이
-구현을 갖지만, 인스턴스는 만들지 못한다.(인터페이스와 공통점)
-한정자 명시 안하면 모든 메소드가 Private된다. ( 차이점)
-추상메소드 가진다
-추상 클래스를 상속받는 파생클래스에서 추상메소드를 반드시 구현하도록 강제한다 (공통점)
-추상 클래스는 또 다른 추상 클래스 상속 가능(공통점)
2. 선언 방식
abstract class 클래스 이름
{
//메소드 및 변수
}
3. 예제 : 추상클래스 상
// Creature.cs
// 추상클래스 Monster
public abstract class Monster
{
// 추상 매서드 Shout() 파생 클래스에서 반드시 구현해야 한다.
public abstract void Shout();
}
// Monster를 상속받는 Orc
class Orc : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("끄아악!");
}
}
// Monster를 상속받는 Skeleton
class Skeleton : Monster
{
// 재정의된 Shout()
public override void Shout()
{
Console.WriteLine("으어억!");
}
}
[추상클래스와 인터페이스의 차이]
1.요약
인터페이스는 변수선언이 가능하고 추상 메서드만 선언가능하지만
추상메서드는 변수선언이 불가능하고 구현된 메서드와 추상 메서드, 가상 메서드를 같이 선언할 수 있다.
2.예제
abstract class AbstractEx{
int num;
public void Func(){
Console.WriteLine("구현된 메소드");
}
public virtual void VirtualFunc(){
Console.WriteLine("가상 메소드");
}
public abstract void AbstractFunc();
};
[가상메소드]
메서드 재정의 : 자식 클래스에서 부모 메서드의 매개 변수 및 반환 타입을 재정의 하는 것.
메서드 재정의는 부모 클래스의 메서드를 virtual 키워드로 선언하며 구현한다.
이를 가상 메서드라 한다.
Virtual 붙은 메소드는 매개변수와 반환 타입 나중에 바꿀 수 있게 한 것.
Override로 메서드 재정의 한다.
'3_c# > C#문법' 카테고리의 다른 글
C# 프로퍼티 (1) | 2024.11.20 |
---|---|
C# 메소드 오버로딩 / 오버라이딩 (0) | 2024.10.02 |
C# TXT파일 접근 - StreamReader, StreamWriter (0) | 2023.07.18 |
C# 클래스 (0) | 2023.07.15 |
C# 예외 처리 : 개념 정리 (0) | 2023.07.13 |