본문 바로가기
IT

[Do it! 자바 프로그래밍 입문] 10 인터페이스

by csongin 2022. 6. 1.
728x90
인터페이스 선언과 구현하기
인터페이스와 다형성 구현
인터페이스 활용하기

인터페이스 선언과 구현하기

인터페이스란?

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

형식적인 선언만 있고 구현은 없음

interface InterfaceName {
    public static final float PI = 3.14f;
    public void add();
}

인터페이스에 선언된 모든 메서드는 public abstract로 추상 메서드

인터페이스에 선언된 모든 변수는 public static final로 상수

 

인터페이스 만들기

public interface Calc { 
    double PI = 3.14; // 인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환됨
    int ERROR = -9999999;
    
    int add(int num1, int num2); // 인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환됨
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
}

클래스에서 인터페이스 구현하기

Calc 인터페이스를

Calculator 클래스에서 구현

Calc의 모든 추상 메서드를  구현하지 않으면

Calculator는 추상 클래스가 됨

 

CompleteCalc클래스가 Calculator를

상속받은 후 모든 메서드를 구현

CompleteCalc는 생성 가능한 클래스

 

인터페이스 구현과 형 변환

인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환할 수 있음

상속에서의 형 변환과 동일한 의미

단 클래스 상속과 달리 구현코드가 없기 때문에 여러 인터페이스를 구현할 수 있음

형 변환시 사용할 수 있는 메서드는 인터페이스에 선언된 메서드만 사용할 수 있음

Calc calc = new CompleteCalc();
/*
CompleteCalc가 Calc 형으로 대입된 경우 사용할 수 있는 메서드
*/

 

인터페이스와 다형성

인터페이스는 "Client Code"와 서비스를 제공하는 "객체" 사이의 약속이다.

어떤 객체가 어떤 interface 타입이라 함은 그 interface가 제공하는 메서드를 구현했다는 의미임

Client는 어떻게 구현되었는지 상관없이 interface의 정의만을 보고 사용할 수 있음 (ex : JDBC)

다양한 구현이 필요한 인터페이스를 설계하는 일은 매우 중요한 일임

 

인터페이스의 요소

상수 : 모든 변수는 상수로 변환됨

추상 메서드 : 모든 메서드는 추상 메서드로 구현

정적 메서드 : 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드

private 메서드  : 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음.

인터페이스 내부에서만 기능을 제공하기 위해 구현하는 메서드

 

디폴트 메서드 정의

// Calc 인터페이스에 디폴트 메서드 정의
public interface Calc {
    ...
    default void description(){
        System.out.println("정수 계산기를 구현합니다.");
    }
}
// CompleteCalc에서 재정의 하기
public class CompleteCalc extends Calculator{
    ...
    @Override
    public void description() {
        super.description();
    }
}

private 메서드

인터페이스 내부에 private 혹은 private static으로 선언한 메서드 구현

private static은 정적 메서드에서 사용가능

public interface Calc {
...
default void description(){
    System.out.println("정수 계산기를 구현합니다.);
    myMethod(); // 디폴트 메서드에서 private 메서드 호출
}

static int total(int[] arr) {
    int total = 0;
    
    for(int i : arr){
    total += i;
    }
    myStaticMethod(); // 정적 메서드에서 private static 메서드 호출
    return total;
}

private void myMethod() {
    System.out.println("private 메서드입니다.); // private 메서드
}
private static void myStaticMethod() {
    System.out.println("private static 메서드입니다."); // private static 메서드
}

두 개의 인터페이스 구현하기

package interfaceex;

public interface Buy {
    void buy();
}
package interfaceex;

public interface Sell{
    void sell();
}

두 인터페이스를 구현한 클래스

package interfaceex;

public class Customer implements Buy, Sell { //Customer 클래스는 Buy, Sell 인터페이스 모두를 구현함
    @Override
    public void sell() {
        System.out.println("구매하기");
    }
    
    @Override
    public void buy() {
        System.out.println("판매하기");
    }

인터페이스 상속

인터페이스 간에도 상속이 가능

구현 코드의 상속이 아니므로 형 상속(type inheritance)이라고 함

 

인터페이스 구현과 클래스 상속 함께 사용하기

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(); // 배열 요수 개수 반환
    }
}

 

반응형