Interface 란?
Interface는 객체와 객체 사이에서 상호작용의 매개로 쓰이는데, 일종의 추상클래스?입니다. 하지만 추상 클래스보다 추상화정도가 높아서 일반 메소드나 멤버변수를 구성원으로 가질 수 없다.
Java 8 이후에는 public, abstract, default, static 메소드를 구현할 수 있습니다.
사람들이 abstract class와 interface에 대하여 차이점과 공통점을 어려워 하시는 것 같습니다.(저 포함 ...)
그래서 차이점과 공통점에 대하여 알아보겠습니다.
https://pabeba.tistory.com/121
Abstract 클래스 | Interface | |
사용 키워드 | abstract | interface |
🤩사용 가능 변수 | 제한 없음 | static final(상수) |
사용 가능 접근 제어자 | 제한 없음 | public |
사용 가능 메소드 | 제한 없음 | public, abstract, default, static |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속) |
공통점 | 1. 계층 구조 형성을 통한 다형성 지원 2. 직접 객체화 불가 ( new 로 생성 불가 ) 3. 추상 메서드를 통한 하위(자식)에게 구현 강제 |
제가 생각하는 가장 큰 차이점은 '인스턴스 변수를 선언할 수 있나 없나'가 가장 큰 차이점이라고 생각합니다.
같이 공부하는 동료가 질문을 해줬습니다. "아니... 그냥 인터페이스만 사용해서 프로그램을 만들면 다중 상속도 되고 얼마나 좋습니까?"라고요. 하지만 인터페이스만 사용하게 되면 인스턴스 변수를 선언할 수 없기 때문에 추상화를 할 수 없다고 답변했습니다.
Interface 의 멤버 변수
Interface의 멤버변수는 public static final 이어야 하며, 생략이 가능합니다.
interface PlayingCard{
public static final int Spade = 4;
final int Diamond = 4;
static int Heart = 4;
int Clover = 4;
}
위에 작성한 내용들은 다 public static final 이지만 생략이 가능합니다.
Interface 상속 가능
Interface는 구현도 되지만 Interface 끼리 상속이 가능합니다.
interface PlayingCard{
public static final int Spade = 4;
final int Diamond = 4;
static int Heart = 4;
int Clover = 4;
}
더 깊은 이해를 위해 예제를 알아봅시다.
예제
원숭이, 새, 비행기, 자동차, 슈퍼맨 이라는 class를 생성하기 위해서
Animal, Vehicle, ET Abstract class를 생성합니다. (이유는 인스턴스 변수를 추상화 할 수 있는 범위를 만드는 것입니다.)
하지만 저것 만으로는 자식 class의 메소드를 완성할 수 없습니다. 이유는 날아다니는 친구들에 대해서는 따로 메소드를 부가해야합니다. 그런데 abstract class에는 공통으로 fly()라는 메소드를 추가할 수 없으니... Flyer라는 Interface를 생성하여 fly() 메소드를 구현할 수 있게 하는 겁니다!
저의 예시가 이해가 안된다면... 다른 예시도 찾아보시길 바랍니다.
소감
처음에는 저도 abstract와 interface의 차이점이 이해안되었는데 가장 중요한 것인 인스턴스 변수의 선언을 할 수 있냐 없냐의 차이가 가장 크다고 생각합니다.
또한 더 높게 추상화 된? 것이 차이점이라고 생각합니다. 너무나도 애매하지만 프로그램 제작하면서부터는 이해가 조금씩 된다고 하니까 조급하게 생각하지말고 천천히 알아가보면 될 것 같습니다.
출처
https://codingwell.tistory.com/73
'코딩 개발 > Java' 카테고리의 다른 글
Java - Map (0) | 2023.04.12 |
---|---|
Java - Set, ArrayList (0) | 2023.04.11 |
Java - abstract (추상클래스, 추상 메소드) (0) | 2023.04.09 |
Java - Static (feat. final, metaspace) (0) | 2023.04.09 |
Java - 다형성(Polymorphism) (0) | 2023.04.09 |