인터페이스란 사용자 또는 컴퓨터 간의 통신이 가능하도록 해주는 디바이스 프로그램을 의미한다. 쉽게 말해서 하나의 표준화를 제공하는 중간 매개체를 뜻한다.
Java에서의 인터페이스는 다른 클래스를 작성할 때 기본이 되는 틀을 제공하고, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스이다.
인터페이스가 기능에 대한 선언을 제공하면 인터페이스를 구현하는 클래스에서는 추상화된 기능을 구현한다.
Java에서 인터페이스는 인터페이스 명 앞에 interface 키워드를 붙여 사용이 가능하다.
그리고 클래스는 클래스명 뒤에 implements 키워드 + 인터페이스명을 입력하여 해당 인터페이스를 구현하고자 함을 선언할 수 있다.
그렇게 어떤 클래스가 인터페이스를 사용(상속)한다면 인터페이스에 선언되어져 있는 메서드를 구현해야 한다.
추상 클래스와 같이 인터페이스에는 메서드의 구체적인 내용이 기술되어 있지 않기 때문에 상속 받은 클래스에서 재정의(오버라이딩)하여 메서드를 이용할 수 있다.
interface Allowance {
int monthly_allowance = 30000;
void in(int value, String name);
void out(int value, String name);
}
interface Academy {
void pay(int academy_fee, String name);
}
Allowance 인터페이스는 용돈의 입출금 기능을 선언하고,
Academy 인터페이스는 학원비 결제 기능을 선언한다고 해보자.
class Student implements Allowance, Academy {
// 인터페이스 구현
@Override
public void in(int value, String name) {
System.out.printf("%s에게서 %d원 용돈을 받았습니다.%n", name, value);
}
@Override
public void out(int value, String name) {
System.out.printf("금액 %d원을 %s(으)로 지출했습니다.%n", value, name);
}
@Override
public void pay(int academy_fee, String name) {
System.out.printf("%s 학원비 %d 입금 완료.%n", name, academy_fee);
}
}
Student 클래스는 위의 두 인터페이스를 구현한다.
implements 키워드를 이용해 인터페이스를 구현하겠음을 선언해준 뒤,
콤마(,)를 이용해 인터페이스를 다중 상속할 수 있다.
Student 클래스에서 인터페이스의 추상 메서드를 오버라이딩하여 기능을 구체화한다.
public class Main {
public static void main(String[] args) {
Student s1 = new Student();
s1.in(5000, "엄마");
s1.out(2000, "PC방");
s1.in(s1.monthly_allowance, "엄마");
s1.pay(300000, "수학 학원");
System.out.println(Allowance.monthly_allowance);
}
}
------------------------------------------------------------
>> 엄마에게서 5000원 용돈을 받았습니다.
>> 금액 2000원을 PC방(으)로 지출했습니다.
>> 엄마에게서 30000원 용돈을 받았습니다.
>> 수학 학원 학원비 300000 입금 완료.
>> 30000
인터페이스를 이용하면 메서드의 추상적인 선언과 그 메서드들을 구체적으로 구현한 부분을 분리할 수 있다. 이렇게 인터페이스를 통해 분업화된 시스템을 구축하여 개발 주체마다 독립적으로 프로젝트를 개발할 수 있다.
https://techvidvan.com/tutorials/abstract-class-vs-interface/
상속을 받기 위해서 추상클래스는 extends 키워드를 사용하고, 인터페이스는 implements 키워드를 사용한다.
추상클래스는 추상메서드, 일반 메서드 모두 가질 수 있다. 반면에 인터페이스는 추상메서드만을 갖는다.
*Java8부터는 default메서드와 static메서드도 가질 수 있게 되었다.
인터페이스에 선언된 변수는 기본적으로 final 변수, 즉 상수이다. 추상클래스는 non-final 변수까지 포함 가능하다.
인터페이스는 오직 static 변수와 final 변수만을 갖는다.
반면에 추상 클래스는 final, non-final / static, non-static 변수 모두를 가질 수 있다.
추상클래스는 인터페이스의 구현을 제공할 수 있으나, 반대로 인터페이스는 추상클래스를 구현할 수 없다.
인터페이스는 오직 다른 인터페이스만을 상속할 수 있다.
추상클래스는 다른 클래스도 상속 가능하며 다중 인터페이스 구현도 가능하다.
인터페이스 변수는 기본적으로 public이다.
추상클래스 변수는 private, protected 등 모든 접근 제어자를 가질 수 있다.
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-java/
인터페이스의 역할과 구현은 앞서 살펴본 추상 클래스와 상당히 유사하다. 그러나 클래스를 다중 상속할 경우 메소드 출처의 모호성 등 여러 문제가 발생할 가능성이 있기 때문에 Java에서는 클래스를 이용한 다중 상속을 지원하고 있지 않다.
하지만 다중 상속의 이점도 있기 때문에 인터페이스를 이용해 다중 상속 기능을 제공하고 있다.
상속을 받는 extends 키워드와 구현을 받는 implements 키워드를 동시에 사용하면 extends 키워드가 먼저 사용되어야 한다.
class Student extends Person implements Allowance, Academy {...}