JAVA

[ Java ] - 인터페이스

algml0703 2022. 9. 6. 09:35
반응형

인터페이스 (interface)

구현 코드가 없는 메서드 즉 추상메서드들로만 이루어진 클래스를 의미하며, interface 키워드를 사용하여 구현한다. 인터페이스는 일종의 설계도 역할을 한다고 볼 수 있다. 

public interface [인터페이스명] { }

・ 인터페이스에 선언된 모든 메서드는 기본값이 public abstract로 된 추상 메서드이다.
・ 인터페이스에 선언된 모든 변수는 기본값이 public static final 로 선언된 상수이다. 
즉 인터페이스에 선언된 모든 변수는 상수로 변환된다.
・ 인터페이스에 선언된 변수와 메서드는 컴파일시에 각각 사용자 정의 상수와 추상메서드로 변환된다.
・ 인터페이스의 경우 추상클래스와 마찬가지로 자기자신은 인스턴스로 생성될 수 없다.
・ 인터페이스를 상속받은 하위클래스에서 인터페이스에 선언된 모든 추상 메서드를 구현하지 않으면, 하위클래스는 추상클래스가 되어 인스턴스를 생성할 수 없게 된다. 만일 하위클래스를 다시 상속받은 하위클래스의 하위클래스에서 인터페이스에서 선언된 모든 메서드를 구현하면 해당 하위클래스를 통해서는 인스턴스를 생성할 수 있다. 
・ 클래스를 extends를 통해 상속받은 경우 구현 상속이라하면, 인터페이스를 implements를 통해 상속받은 경우에는 타입상속이라 한다.
・ 인터페이스 타입으로 구체화된 하위클래스 인스턴스를 생성하는 것도 가능한다.
ex) Calc calc = new MyCalculator();
・ 클래스를 상속받을 때 extends를 사용했던 것과 다르게, 인터페이스를 상속받을 때는 implements를 사용한다.
・ 하위클래스에서 하나의 상위클래스만 상속받을 수 있던 것과 다르게 ,를 사용해 여러 인터페이스를 상속 받을 수도 있다. 
ex) pulic class [하위클래스] implements [인터페이스1], [인터페이스2]
・ 일반클래스와 인터페이스를 동시에 상속받는 것도 가능하다. 단 이때에도 인터페이스가 아닌 일반 클래스는 1개만 상속받을 수 있다.
ex) public class [구현되는하위클래스] extends [상속받을상위클래스] implements [상속받을인터페이스1], [상속받을인터페이스2] 
・ 인터페이스 간에도 상속이 가능하다.
ex) public interface testInterface extends aInterface, bInterface { }

java 8에서 추가된 내용

- 인터페이스에 구현된 private 메서드는 인터페이스 내부에서 기능을 제공하기 위해 사용된다. 
- 디폴트 메서드(default )
: 기본 구현을 가지는 메서드로, 인터페이스를 상속받은 하위클래스에서 재정의도 가능하다.
- 정적메서드
: 인터페이스는 본래 new를 통해 인스턴스를 생성하지 못하고, 인터페이스 내에 생성된 메서드를 직접적으로 사용하지 못했는데,  static을  통해 기능을 구현하여 해당 인스턴스명을 통해 메서드를 사용할 수 있다. 
- 반면에 default를 통해 구현한 경우에는 해당 인터페이스를 상속받은 하위클래스를 인스턴스로 생성하여 사용할 수 있다.

public interface IMyInterface {
    //public static final String Message = "User define constant";
    String Message = "User define constant";

    default void defaultMethod() {
        System.out.println("defined Method");
    }

    public static void staticMethod() {
        System.out.println("static Method");
    }

}
public class MyClass implements IMyInterface{}
public class AbstractAssist {
    public static void main(String[] args) {
        IMyInterface.staticMethod();
        // static으로 선언된 메서드의 경우 인터페이스명만을 통해서도 접근 가능하다.
        
        //IMyInterface.defaultMethod();
        // default로 선언된 메서드에 인터페이스명을 통해 직접 접근시 에러가 난다.
        MyClass myClass = new MyClass();
        myClass.defaultMethod();
        // default로 선언된 메서드는 해당 인터페이스를 상속받은 하위클래스를 인스턴스객체로 만든 후 , 해당 인스턴스 객체를 통해서만 접근할 수 있다.
    }
}

ex) 인터페이스에서 만들어준 메서드는 해당 인터페이스를 상속받은 하위클래스에서 반드시 재정의되어야 한다.

public interface IBehavior {
    public abstract  void play();
}
public class Sport {}
public class Soccer extends Sport implements  IBehavior {
    @Override
    public void play() {
        System.out.println("playing soccer~~");
    }
}

 

ex) Calc 클래스

- Calc 인터페이스를 상속받은 하위클래스

 

 

출처

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%85%EB%AC%B8#curriculum

반응형