JAVA

인터페이스(INTERFACE)보충 및 다형성(POLYMORHPISM)

🤖 Play with Android 🤖 2021. 7. 11. 16:04
728x90


인터페이스(Interface)를 이용하면 앞으로 만들 클래스의 메소드 규격을 선언할 수 있다.

인터페이스에서 이를 이용해서 만들 클래스의 메소드의 형식을 미리 선언하고,

인터페이스를 이용해서(implements 키워드) 만드는 클래스는 인터페이스의 메소드를 정의한다.

 

자바 인터페이스는 기본적으로 추상메서드의 모음이다. 추상 메서드는 아래와 같이 구현부가 없는 메서드를 말한다.

 

interface Printable{
    void print(); // 메소드를 인터페이스에 정의할 때는 내용이 들어가지 않는다.
}

 

구현부가 없으므로 인터페이스를 만든다면 반드시 구현하는 클래스를 만들어야 하며, 인터페이스를 구현하기로 한 클래스는 반드시 인터페이스에 명시되어 있는 추상메서드들을 모두 구현해야 한다. 만약 이를 구현하지 않으면 컴파일 에러가 발생한다.

 

class RealCal implements Printable{

    public void print() {
        System.out.println("This is RealCal");
    }
 }

 

인터페이스는 구현과 상속을 모두 할 수 있다.

  • 인터페이스를 사용하는 구체 클래스는 해당 인터페이스를 구현해야 한다.
  • 인터페이스 사이에는 상속을 할 수 있다.

인터페이스를 사용하면 다중 상속이 가능하다. 인터페이스 사이에서도, 구체 클래스에서도 여러 인터페이스를 구현 및 상속할 수 있다.

 

interface Claculable {
    double PI = 3.14; // 변수를 인터페이스에 정의할 때는 내용을 적는다.
    int sum(int v1, int v2); //메소드를 인터페이스에 정의할 때는 내용이 들어가지 않는다.
}
interface Printable{
    void print(); //메소드를 인터페이스에 정의할 때는 내용이 들어가지 않는다.
}
class RealCal implements Claculable, Printable{
    public int sum(int v1, int v2){
        return v1 + v2;
    }

    public void print() {
        System.out.println("This is RealCal");
    }
}

 

인터페이스에는 변수를 정의할 수도 있다.

다만 변수는 반드시 초기화되어야 한다.

인터페이스를 적용한 클래스는 변수를 다시 대입할 수 없다.

 


클래스의 인스턴스를 변수로 선언할 때, 해당 클래스의 데이터 타입으로 선언하지 않고

부모 클래스나 인터페이스를 데이터 타입으로 선언할 수도 있다.

 

이렇게 객체의 타입이 부모 클래스, 인터페이스, 자식 클래스 등 여러 형태인데도 인스턴스로 만든 객체(자식 클래스의 인스턴스)와 같이 행동하는 것을 다형성(polymorphism)이라고 한다.

 

interface Claculable {
    double PI = 3.14; // 변수를 인터페이스에 정의할 때는 내용을 적는다.
    int sum(int v1, int v2); //메소드를 인터페이스에 정의할 때는 내용이 들어가지 않는다.
}
interface Printable{
    void print(); //메소드를 인터페이스에 정의할 때는 내용이 들어가지 않는다.
}
class RealCal implements Claculable, Printable{
    public int sum(int v1, int v2){
        return v1 + v2;
    }

    public void print() {
        System.out.println("This is RealCal");
    }
}

public class InterfaceApp {
    public static void main(String[] args) {
        RealCal r = new RealCal();
        Printable p = new RealCal(); // 다형성을 사용
        Claculable c = new RealCal(); // 다형성을 사용

        System.out.println(c.sum(2,1));
        p.print();
        System.out.println(c.PI);
    }
}

 

ReaCal 인스턴스를 Calculable 타입으로 선언하면, Printable 메소드를 사용할 수 없다.

반대로 Printable 타입으로 선언하면, Calculable 메소드를 사용할 수 없다.