학습 일자 : 2023.04.07


인터페이스 (Interface)

인터페이스는 구현 없이 선언만 가지고 있음.

인터페이스는 맴버를 가질 수 있지만 직접 구현하지 않음 단지 정의만을 가짐 (can -a 관계)

→ 인터페이스는 상속 받은 클래스에서 내부를 다시 다 구현해야 하기 때문에 코드 재사용에 대한 의미는 없음.

<aside> 💡 인터페이스 기본 형태 [접근제한자] interface [인터페이스 이름] { …인터페이스 내용… }

</aside>

접근제한자 안 쓰면 기본값은 public

→ 인터페이스는 반드시 상속 받아서 구현을 해야 의미가 있기 때문에 보통 인터페이스 접근제한자는 public로 많이 설정하긴 한다.

인터페이스에서 메소드 내용 구현도 가능해졌지만, 구현하지 않는 것을 권장함.

→ 인터페이스 사용 용도에 위반하는 형태이기 때문에 구현X

→ 인터페이스에 메소드 내용까지 구현했다면 반드시 상속 받은 클래스에서 재정의 해주지 않아도 괜찮음 (오류X)

인터페이스의 다중 상속

인터페이스는 다중 상속을 지원함

(클래스는 다중 상속을 허용하지 않음 → 죽음의 다이아몬드 : 클래스의 단일 상속)

인터페이스는 선언만 하고, 내부를 구현하지 않기 때문에 다중 상속을 한다고 해도 죽음의 다이아몬드 현상이 일어나지 않음

image.png

생명체, 육지 생물, 수중 생물이 인터페이스라고 가정 했을 때, 다음과 같은 용도로 “숨쉬기”메소드를 선언했다.

개구리 클래스에서 육지 생물과 수중 생물을 모두 상속 받았을 때 인터페이스에서 어떤 용도로 선언을 했던 지 실제 내부 구현은 개구리 클래스에서 하기 때문에 전혀 문제가 되지 않는다. (인터페이스는 행동이 가능하다고 “정의”만 하기 때문이다)

따라서, 클래스 다중 상속 시에 발생할 수 있던 내부 혼선이 제거됨. → 다중 상속이 가능해짐

	//생명체
	public interface Life 
	{
		public void Breathe();
	}

	//육지생물
	public interface LandCreatures : Life
	{
		public void Run();
	}

	//수중생물
	public interface AquaticLife : Life
	{
		public void swim();
	}

	//개구리
	public class frog : LandCreatures, AquaticLife //다중 상속
	{
		public void Breathe() { Console.WriteLine("땅과 물에서 숨을 쉼"); }

		public void Run() { Console.WriteLine("달림"); }

		public void swim() { Console.WriteLine("헤엄침"); }
	}

추상클래스 VS 인터페이스

공통점 : 함수에 대한 선언만 정의하고, 상속 받은 클래스에서 구체화해서 사용함.

차이점

추상클래스 (abstract) 인터페이스 (interface)
A is B 관계 - 자식 클래스가 부모 클래스이 하위 분류 A can B 관계 - 클래스에서 해당 행동이 가능함
다중 상속 X 다중 상속 O
설계도 계약서