인터페이스

JH·2022년 12월 11일
0

2022-Java-Study

목록 보기
10/10

인터페이스

모든 메서드가 추상 메서드로 이루어진 클래스

  • 형식적인 선언만 있고 구현은 없음
  • 인터페이스에 선언된 메서드는 추상메서드(public abstract), 변수는 상수(public static final)

interface implements: 타입상속
class extends: 구현상속

package interfaceEX;

public interface Calc {
    // 상수로 선언된다.
    double PI = 3.14;
    int ERROR = -999999999;

    // 인터페이스 키워드 안에 선언되면 추상메서드가 된다.
    int add(int num1, int num2);
    int sub(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
}
package interfaceEX;

public class CompleteCalc implements Calc{
    @Override
    public int add(int num1, int num2) {
        return num1 + num2;
    }

    @Override
    public int sub(int num1, int num2) {
        return num1 + num2;
    }
    
    @Override
    public int times(int num1, int num2) {
        return num1 * num2;
    }

    @Override
    public int divide(int num1, int num2) {
        if (num2 != 0){
            return num1 / num2;
        }
        return ERROR;
    }

    public void showInfo(){
        System.out.println("Calc 인터페이스를 구현했습니다.");
    }
}

인터페이스 구현과 형변환

  • 상속에서의 형변환과 동일한 의미
  • 단, 클래스 상속과 달리 구현코드가 없어 여러 인터페이스 구현 가능 (다중상속)
package interfaceEX;

public class CalculatorTest {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;

		// Calculator, CompleteCalc 클래스로 가능
        Calc calc = new CompleteCalc();
        System.out.println(calc.add(num1, num2));
    }
}

인터페이스와 다형성

  • 인터페이스는 Client Code와 서비스를 제공하는 객체 사이의 약속
  • 어떤 객체가 interface 타입이면 그 인터페이스가 제공하는 메서드를 구현했다는 의미
  • Client의 구현과 상관없이 interface의 정의만 보고 사용 가능

인터페이스 요소

  1. 상수: 모든 변수는 상수

  2. 추상 메서드: 모든 메서드는 추상 메서드

  3. 디폴드 메서드: 기본 구현을 가지는 메서드, 구현 클래스에서 재정의 가능 (default ~)

  4. 정적 메서드: 인스턴스 생성과 상관없이 인터페이스 타입으로 사용가능한 메서드

  5. private 메서드: 인터페이스를 구현한 클래스에서 사용, 재정의 불가, 인터페이스 내부에서만 기능제공

인터페이스 상속

  • 인터페이스 간에도 상속이 가능
  • 타입 상속
public interface X{
    void x();
}
public interface Y{
    void y();
}

public interface MyInterface extends X,Y{
    void myMethod();
}

public class MyClass implements MyInterface{

    @Override
    public void myMethod() {

    }

    @Override
    public void x() {
        
    }

    @Override
    public void y() {

    }
}
  • 인터페이스 구현과 클래스 상속을 함께 사용 가능
// 인터페이스
public interface Queue{
    void enQueue(String title);
    String deQueue();
    int getSize();
}
// 클래스
import java.util.ArrayList;

public class Shelf{
	// 상속 클래스에서 사용가능
    protected ArrayList<String> shelf;

    public Shelf(){
        shelf = new ArrayList<String>();
    }

    public ArrayList<String> getShelf(){
        return shelf;
    }

    public int getCount() {
        return shelf.size();
    }
}
// 클래스, 인터페이스 상속받은 클래스
public class BookShelf extends Shelf implements Queue{

    @Override
    public void enQueue(String title) {
        shelf.add(title);
    }

    @Override
    public String deQueue() {
        return shelf.remove(0);
    }

    @Override
    public int getSize() {
        return getCount();
    }
}
profile
매일 한 문제씩 풀기

0개의 댓글