3_c#/C#문법

C# 인터페이스 / 추상 클래스

Mi:sAng 2023. 7. 13. 22:22

[인터페이스]

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