Interface (인터페이스)
- 인터페이스는 내부의 모든 필드가 public static final 로 정의됨
- 인터페이스의 static, default메서드를 제외한 모든 메서드는 public abstract 로 정의됨
- 인터페이스는 다중상속을 지원한다.
- 인터페이스는 동일한 목적하에 동일한 기능을 수행하게끔 강제하는것이 역할이자 개념
- 인터페이스는 "Inteface" 키워드를 통해 선언할 수 있으며, "implements" 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다.
public interface Drawable{
void draw();
}
Abstatct Class (추상 클래스)
- 구제적이지 않은 클래스이다. (메서드의 본체가 완성되지 않은 미완성 메서드)
- 클래스들의 공통되는 메소드를 정의한 클래스
- 추상클래스는 클래스 앞에 "abstarct" 키워드를 이용해서 정의한다.
- 추상클래스는 미완성인 추상 메소드를 포함 할 수 있다.
- 추상메소드는 리턴타입앞에 "abstarct" 키워드를 붙여야한다.
- 인스턴스를 생성할 수 없다. (상속을 통해 서브클래스에서 생성)
- 추상클래스는 다른 클래스를 확장하고 여러 인터페이스를 구현 할 수 있음
public abstract class Shape{
public abstract void draw();
}
Interface VS Abstract Class
인터페이스와 추상클래스는 상속(extends)받거나 구현(implements)하는 클래스가 인터페이스나 추상클래스 안의 추상메서드를 구현하도록 강제하는 공통점을 가지고 있다.
그러나 인터페이스와 추상클래스는 구현하는 목적이 서로 다르다!
Interface
- 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상메서드를 정의해놓고 구현(implement)하는 클래스에서 각 기능들을 오버라이딩하여 여러 형태로 구현할 수 있다.
- 인터페이스는 해당 인터페이스를 구현하는 클래스들에게 동일한 메서드와 동작을 강제하기 위해 존재한다.
- 그러나 모든 클래스가 인터페이스를 이용한다면 공통적으로 필요한 기능도 implements하는 모든 클래스들이 오버라이딩 하여 재정의해야 하는 번거로움이 존재한다.
- 인터페이스는 다른 추상메서드를 사용하는 클래스들의 공통 기능을 명시할 때 사용하면 편리함.
Abstract Class
- 추상클래스는 상속관계에서 추상클래스를 상속받으며 같은 부모(여기에서는 추상클래스)를 상속받는 자식 클래스들간에 공통 기능을 각각 구현하고, 확장시키는 상속과 관련되어 있다.
- 추상클래스를 상속하며 클래스들간의 구분이 가능해진다.
- 클래스는 다중 상속이 되지 않는다. (다중상속의 모호성 때문에 자바에서는 다중상속이 불가능하다)
Interface VS Abstract Class Example
위의 예제를 살펴보자
Creature 라는 생물체는 Animal, Plant를 상속한다.
각 클래스들이 하는 기능들을 인터페이스로 구현했다.
Nick은 프로그램을 짤수있으니 Programmer 인터페이스를 Cat, Dog는 꼬리를 흔드니 Tail 인터페이스를 통해 구현했다.
여기서 인터페이스를 쓰는 이유를 알 수 있는데,
Eatable이라는 인터페이스는 Animal, Plant 각각 다른 부모 클래스받는 (상속관계가 다른) Nick, Cat, Dog, FlyHellPlant에게 공통기능인 Eat을 인터페이스를 사용하여 상속관계가 달라도 같은 기능을 강제시키고 있다.
추상메서드의 사용목적은 위에서 언급했다시피 공통기능을 구현하는 목적이다.
Tail(꼬리를 흔들다) 인터페이스는 동일한 부모 클래스인 Aniaml을 상속받는 Cat, Dog에서 사용하는 기능이므로
추상메서드를 생성해서 아래와 같이 표현 할 수 있다.
Animal클래스를 상속받는 Tail클래스에 꼬리를 흔드는 기능을 추상메서드로 정의하여 같은 부모 클래스를 상속받는 관계에서 공통 기능의 구현을 강제할 수 있다.
본문 이미지 PPT
참고한 곳
'Language > Java' 카테고리의 다른 글
[Java] 인터페이스 타입의 입력 매개변수 전달 (0) | 2022.04.03 |
---|---|
[Java] 익명 클래스, 익명 이너 클래스 (0) | 2022.04.03 |
[Java] 업캐스팅, 다운캐스팅 (0) | 2022.04.02 |
[Java] 메소드 오버라이딩 / 메소드 오버로딩 (0) | 2021.07.15 |
[Java] 클래스, 객체, 인스턴스, 메소드 란? (0) | 2021.07.14 |