인터페이스 INTERFACE

2022. 3. 4. 16:44·Programing/JAVA
  • 프로그램과 프로그램을 중간에서 연결해 줌
  • UI (User Interface) : 사용자와 프로그램과 연결(저장 버튼 클릭 -> 저장 실행)
  • API (Application Programming Interface) : 작업 프로그램과 제공 프로그램 연결 규약
  • Web API : 웹을 통해 연결(지도, 주소 찾기, 위경도 찾기 등...)

자바에서 인터페이스

  • 추상클래스가 미완의 클래스라면 인터페이스는 기본클래스
  • 인터페이스는 클래스 설계용으로 많이 사용
  • 상속은 수직 구조 설계, 인터페이스는 수평 구조 설계
  • 클래스 설계를 인터페이스로 하면 설계된 메서드의 구현을 강제 할 수있음
  • 오직 추상메서드와 상수만을 멤버로 가짐
  • class 키워드 대신 interface 사용
  • 인터페이스에 있는 추상메서드를 다 구현하지 않으면 추상 클래스가 됨
  • 인스턴스 생성 불가
  • 인터페이스와 간 다중 상속이 가능
  • 클래스와 인터페이스 간 다중 구현(impliments)이 가능

멤버 변수 : 상수

  • 모든 멤버변수는 public static final 상수
  • 생략하면 컴파일시 자동 변환
  • 상수이므로 초기값 반드시 지정

메서드 : 추상메서드

  • 모든 메서드는 public abstract 추상메서드
  • 생략하면 컴파일시 자동 변환

default, static 메서드

  • 자바 8(1.8) 부터 지원
  • 메서드에 구현부 있음
  • 하위 버전 호환성 확인 후 사용(일반적으로 사용 안함)

인터페이스 구현

인터페이스 설계

package chapter09;

public interface InterfaceEx {

    // 상수
    public int MIN_PRICE = 0;
    public int MAX_PRICE = 100000;

    // 추상 메서드
    public double meanPrice();
    public double totalPrice();

    // default 메서드
    default double getSalePrice(double price) {
        return price - (price * 0.05);
    }

    // static 메서드
    static void printPrice(double price) {
        System.out.println(price);
    }

}

인터페이스 구현

package chapter09;

public class InterfaceExImpl implements InterfaceEx{

    @Override
    public double meanPrice() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public double totalPrice() {
        // TODO Auto-generated method stub
        return 0;
    }

}

테스트

package chapter09;

public class IntereFaceTest {

    public static void main(String[] args) {

        // static method
        InterfaceEx.printPrice(0);

        // impl 
        InterfaceExImpl ie = new InterfaceExImpl();
        ie.getSalePrice(0); // default method

        ie.meanPrice(); // impl method
        ie.totalPrice(); // impl mehod

    }

}

인터페이스 다중 구현

  • 3개의 인터페이스와 하나의 다중 구현 작성

Printer Interface

package chapter09;

public interface Printer {

    int INK = 100;
    void print();

}

Scanner Interface

package chapter09;

public interface Scanner {

    void scan();

}

Fax Interfacee

package chapter09;

public interface Fax {

    String FAX_NUMBER = "02-1234-5678";
    void send(String tel);
    void receive(String tel);

}

Interface Implements

package chapter09;

public class Complexer implements Printer, Scanner, Fax {

    @Override
    public void send(String tel) {
        System.out.println(FAX_NUMBER + "에서 "+tel+"로 FAX 전송");

    }

    @Override
    public void receive(String tel) {
        System.out.println(tel + "에서 "+FAX_NUMBER+"로 FAX 수신");

    }

    @Override
    public void scan() {
        System.out.println("스캔 실행");

    }

    @Override
    public void print() {
        System.out.println("출력 실행");

    }


}

인터페이스 익명 구현

  • 구현 클래스 없이 바로 인터페이스 구현
  • 이벤트 프로그램(GUI, 안드로이드 앱)시 많이 사용
package chapter09;

public class ComplexerMain2 {

    public static void main(String[] args) {

        Fax fax = new Fax() {

            @Override
            public void send(String tel) {
                System.out.println("여기는 익명 구현 객체의 send()");

            }

            @Override
            public void receive(String tel) {
                System.out.println("여기는 익명 구현 객체의 receive()");

            }

        };

        fax.send("1234");
        fax.receive("5678");
    }
}

인터페이스 상속

package chapter09;

public interface ComplexcerInterface extends Printer, Scanner, Fax {

}

테스트 - 익명구현

package chapter09;

public class ComplexerMain3 {

    public static void main(String[] args) {

        ComplexcerInterface ci = new ComplexcerInterface() {

            @Override
            public void send(String tel) {
                System.out.println("여기는 익명 구현 객체의 send()");

            }

            @Override
            public void receive(String tel) {
                System.out.println("여기는 익명 구현 객체의 receive()");

            }

            @Override
            public void print() {
                System.out.println("여기는 익명 구현 객체의 print()");

            }

            @Override
            public void scan() {
                System.out.println("여기는 익명 구현 객체의 scan()");

            }

        };

        ci.send("1234");
        ci.receive("5678");
        ci.print();
        ci.scan();
    }
}

인터페이스 다형성

  • 상속관계에서 처럼 구현관계에서도 다형성 사용 가능
  • 인터페이스를 부모클래스로 구현클래스를 자식클래스으로 생각하면 동일함
  • 매개변수로 다형성 사용등 모두 동일하게 다형성 사용 가능

Interface

package chapter09;

public interface GraphicCard {

    String MEMORY = "2G";

    public void process();

}

implements

package chapter09;

public class Amd implements GraphicCard {

    public void process() {
        System.out.println("AMD 그래픽 처리");
    }

}
package chapter09;

public class Nvidia implements GraphicCard {

    public void process() {
        System.out.println("Nvidia 그래픽 처리");
    }

}

test - 인터페이스 다형성

package chapter09;

public class Computer {

    public static void main(String[] args) {

        GraphicCard gc = new Amd();

        System.out.println("메모리 : "+gc.MEMORY);

        // Amd로 생성
        gc = new Amd(); // 자동 형변환
        gc.process();

        // Nvidia로 교체
        gc = new Nvidia(); // 자동 형변환
        gc.process();

    }

}

다형성 - 강제 형변환

  • 부모클래스의 참조변수 다형성 사용시 오버로딩한 메소드는 자동 사용 가능하나 자식클래스에 추가 메서드의 경우에는 사용 불가
  • 다형성의 참조변수를 실제의 참조 클래스로 형변환

인터페이스 정의

package chapter09;

public interface Animal {

    void sleep();
}

인터페이스 구현

package chapter09;

public class Eagle implements Animal {

    public void sleep() {
        System.out.println("잠을 잔다.");
    }

    public void eat() {
        System.out.println("먹는다.");
    }


}

테스트 - 강제 형변환

package chapter09;

public class AnimalMain {

    public static void main(String[] args) {

        Animal eagle = new Eagle();

        eagle.sleep();
        // eagle.eat(); // 에러

        Eagle eagleObj = (Eagle)eagle; // 강제 형변환
        eagleObj.eat(); // Eagle 클래스의 eat() 메서드

        System.out.println(eagle instanceof Animal);
    }
}

instanceof

  • 참조변수가 참조하는 인스턴스 실체 타입 확인
  • 연산 결과로 boolean 값(true, false) 반환
  • true 라는 것은 형변환이 가능하는 것을 뜻 함
  • 조상 멤버를 상속 받으 자손타입은 Object, 조상타입, 자손타입 모두 true 가 된다
package chapter09;

public interface A {

    void a();
}
package chapter09;

public interface AA extends A {

    void aa();
}
package chapter09;

public class AAA implements AA {

    @Override
    public void a() {

    }

    @Override
    public void aa() {

    }

}
package chapter09;

public interface AB extends A {

    void ab();
}
package chapter09;

public class ABB implements AB {

    @Override
    public void a() {

    }

    @Override
    public void ab() {

    }

}

테스트

package chapter09;

public class InstanceofEx {

    public static void main(String[] args) {
        A a = new AAA();
        AA aa = new AAA();
        AAA aaa = new AAA();

        A b = new ABB();
        AB ab = new ABB();
        ABB abb = new ABB();

        System.out.println("a > A : " + (a instanceof A));
        System.out.println("aa > A : " + (aa instanceof A));
        System.out.println("aaa > A : " + (aaa instanceof A));

        System.out.println("====================");

        System.out.println("b > A : " + (b instanceof A));
        System.out.println("ab > A : " + (ab instanceof A));
        System.out.println("abb > A : " + (abb instanceof A));

        System.out.println("====================");

        System.out.println("aaa > AB : " + (aaa instanceof AB));

        System.out.println("====================");

        System.out.println("aaa > Object : " + (aaa instanceof Object));
        System.out.println("abb > Object : " + (abb instanceof Object));


    }

}

어노테이션 Annotation

  • 프로그램에서 추가적인 정보 제공
  • @Override : 오버라이딩 검사, 부모클래스, 인터페이스 구현 시 메서드 체크 기능
  • @SupresWarnings : 경고메세지 표시 안되도록 설정
  • 스프링 웹 프레임워크등에서 많이 사용됨
package chapter09;

public class Parent {

    public void method2() {
        System.out.println("Parent 클래스의 method2()");
    }
}
package chapter09;

public class Child extends Parent {


    @Override
    public void method22() { // 오류남

        super.method2();
    }

}

 

'Programing > JAVA' 카테고리의 다른 글

JAVA- API  (1) 2022.03.07
예외처리 EXCEPTION  (1) 2022.03.07
상속 INHERITANCE_Part3  (0) 2022.03.03
상속 INHERITANCE_Part2  (1) 2022.03.03
상속 INHERITANCE_Part1  (2) 2022.03.03
'Programing/JAVA' 카테고리의 다른 글
  • JAVA- API
  • 예외처리 EXCEPTION
  • 상속 INHERITANCE_Part3
  • 상속 INHERITANCE_Part2
쿠크
쿠크
  • 쿠크
    쿠크 개발자
    쿠크
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Kubernetes (2)
      • Programing (35)
        • JSP (3)
        • JAVA (22)
        • Spring (5)
        • HTML (5)
      • 이외 (12)
        • Git (2)
        • 임시 잡다함 (6)
        • IntelliJ (1)
        • 에러 모음 (2)
      • OS (2)
        • Linux (2)
      • DataBase (2)
        • Mysql (1)
      • 토이 프로젝트 (0)
        • 게시판 만들기 (0)
      • Spring (0)
      • 부동산 or 주식 (0)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 링크

    • 깃 허브 주소
  • 공지사항

  • 태그

    jsp
    상속
    에러 발생
    IntelliJ
    HTTP란
    에러원인
    java
    스프링 특징
    MVC
    ubuntu
    HTML
    spring-framework
    MySQL
    Database
    kubernetes
    Linux
    클래스
    error
    spring
    spring-framwork
  • hELLO· Designed By정상우.v4.10.3
쿠크
인터페이스 INTERFACE
상단으로

티스토리툴바