인터페이스는 일종의 추상 클래스이며 인터페이스는
추상메소드 처럼 추상 메소드를 가지지만
일반메소드 또는 멤버변수(필드)를 가질 수 없다.
오직 추상 메소드와 상수만 가질 수 있다.
- 극단적으로 동일한 목적 하에 동일한 기능을
보장하게 하기 위함으로 사용한다.- 자바의 다형성을 이용해 개발코드 수정을
줄이고 유지 보수성을 높이기 위해 사용한다.
- 다중 구현(상속) 가능
- 자식 클래스가 여러 부모 인터페이스들을
상속 받을 수 있다.
- 추상 메소드만 보유
- 인터페이스는 추상 메소드와 상수만 가질 수
있다.
- 생성자 생성 불가
- 생성자 모두 생성이 불가 하다.
- 메소드 오버라이딩 필수
- 자식 클래스는 부모 인터페이스의 함수를
모두 오버라이딩 해야한다.
- 구현부( {} )가 없다.
- 인터페이스에는 객체 생성이 불가하여
추상메소드만 쓰는데 이때 메소드에 구현부가 없다.
interface Animal{
//추상 메소드만 작성 가능
//메소드의 구현부가 없다.
public void cry();
}
class Cat implements Animal{
public void cry(){
System.out.println("냐옹 냐옹")
}
}
class Dog implements Animal{
public void cry(){
System.out.println("멍멍")
}
}
public class Main{
public static void main(String[] args){
Cat c = new cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
Cat/Dog은 인터페이스를 implements 구현(상속)
했을 뿐 인터페이스가 아니기 때문에 객체 생성이 가능 하다.
인터페이스는 자식 클래스에서 구현하지 않은
메소드를 재정의(Override)하여 구현 하도록 강제하고 있다.
무슨 말인지 밑에 예시를 보며 알아보자
public interface Appliance{
void PowerOn();
void PowerOff();
}
public class Fridge implements Appliance{
/*Appliance에 있는 추상 메소드를
*Fridge 클래스에 구현(상속)을 하고
*Appliance에 있는 추상 메소드를
*Fridge에 Override를 함으로써
*/구현 하도록 강제 하고 있다.
@Override
public void PowerOn(){
System.out.println("냉장고를 켜다.")
}
@Override
public void PowerOff(){
System.out.println("냉장고를 끄다.")
}
}
public class Main{
public static void main(String[] args)
new Fridge().PowerOn();
new Fridge().PowerOff();
}
인터페이스는 new로 객체 생성이 불가 하다.
하지만 위 예시에서 말했듯이 인터페이스를 구현(상속)
받은 클래스는 객체 생성이 가능 하여 메인메소드에는
인터페이스를 구현(상속)한 클래스로 객체를 생성한다.
public interface Calculator{
int multiply(int num1, int num2);
int divide(int num1, int num2);
}
public class CalculatorImpl implements Calculator{
@Override
public int multiply(int num1, int num2){
return num1 * num2;
}
@Override
public int divide(int num1, int num2){
if(num2 == 0){
return -9999999999;
}else{
return num1 / num2;
}
}
}
public class Main{
public static void main(String[] args){
Calcilator calc = new CalculatorImpl();
int num1 = 10;
int num2 = 0;
System.out.println(num1 + " * " + num2 + " = " + calc.multiply(num1, num2));
System.out.println(num1 + " / " + num2 + " = " + calc.divide(num1, num2));
}
}