티스토리 뷰

목차



    반응형
    인터페이스 선언과 구현하기
    인터페이스와 다형성 구현
    인터페이스 활용하기

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

    인터페이스란?

    모든 메서드가 추상 메서드(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(); // 배열 요수 개수 반환
        }
    }

     

    반응형