- 프로그램과 프로그램을 중간에서 연결해 줌
- 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 |