====== Ch.09 인터페이스 ======
===== 인터페이스 선언 =====
**인터페이스의 구조**
[public] interface 인터페이스명 {
[public abstract] 리턴타입 추상메서드명();
[public] default 리턴타입 메서드명 (매개변수...) {...}
[public] static 리턴타입 메서드명(매개변수...) {...}
}
:wr:**상수**
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);
}
}
===== 인터페이스 구현 =====
**Printer.java**
package chapter09;
public interface Printer {
int INK = 100;
void print();
}
**Scanner.java**
package chapter09;
public interface Scanner {
void scan();
}
**Fax.java**
package chapter09;
public interface Fax {
String FAX_NUMBER = "02-1234-5678";
void send(String tel);
void receive(String tel);
}
**Complexer.java**
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("출력 실행");
}
}
**ComplexerMain.java**
package chapter09;
public class ComplexerMain {
public static void main(String[] args) {
Complexer com = new Complexer();
System.out.println(Complexer.INK);
System.out.println(Complexer.FAX_NUMBER);
com.print();
com.scan();
com.send("02-8765-4321");
com.receive("02-8765-4321");
}
}
:wr:**익명구현객체**
인터페이스 객체명 = new 인터페이스(){
// 인터페이스의 모든 추상 메서드 구현
};
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");
}
}
**ComplexcerInterFace.java**
package chapter09;
public interface ComplexcerInterface extends Printer, Scanner, Fax {
}
**ComplexerMain3.java**
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();
}
}
===== 인터페이스의 다형성 =====
**GraphiicCard.java**
package chapter09;
public interface GraphicCard {
String MEMORY = "2G";
public void process();
}
**Amd.java**
package chapter09;
public class Amd implements GraphicCard {
public void process() {
System.out.println("AMD 그래픽 처리");
}
}
**Nvidia.java**
package chapter09;
public class Nvidia implements GraphicCard {
public void process() {
System.out.println("Nvidia 그래픽 처리");
}
}
**Computer.java**
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();
}
}
:wr:**매개 변수의 다형성**
package chapter08.poly;
public class Game {
void display(GraphicCard gc) {
gc.process();
}
}
Game g = new Game();
Amd gc = new Amd();
g.display(gc);
Nvidia gc2 = new Nvidia();
g.display(gc2);
:wr:**강제 형변환**
**Animal.java**
package chapter09;
public interface Animal {
void sleep();
}
**Eagle.java**
package chapter09;
public class Eagle implements Animal {
public void sleep() {
System.out.println("잠을 잔다.");
}
public void eat() {
System.out.println("먹는다.");
}
}
**AnimalMain.java**
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);
}
}
:wr:**instanceof**
객체 isntanceof 클래스(인터페이스)
**A.java**
package chapter09;
public interface A {
void a();
}
**AA.java**
package chapter09;
public interface AA extends A {
void aa();
}
**AAA.java**
package chapter09;
public class AAA implements AA {
@Override
public void a() {
}
@Override
public void aa() {
}
}
**AB.java**
package chapter09;
public interface AB extends A {
void ab();
}
**ABB.java**
package chapter09;
public class ABB implements AB {
@Override
public void a() {
}
@Override
public void ab() {
}
}
**InstanceofEx.java**
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("aaa > AB : " + (aaa instanceof AB));
}
}
===== default 메서드와 static 메서드 =====
**MyInterface1.java**
package chapter09;
public interface MyInterface1 {
default void defaultMethod() {
System.out.println("MyInterface1 의 default 메서드");
}
static void staticMethod() {
System.out.println("MyInterface1의 static 메서드");
}
}
**MyInterface2.java**
package chapter09;
public interface MyInterface2 {
default void defaultMethod() {
System.out.println("MyInterface2 의 default 메서드");
}
static void staticMethod() {
System.out.println("MyInterface2의 static 메서드");
}
}
**Parent.java**
package chapter09;
public class Parent {
public void method2() {
System.out.println("Parent 클래스의 method2()");
}
}
**Child.java**
package chapter09;
public class Child extends Parent implements MyInterface1, MyInterface2 {
@Override
public void defaultMethod() {
System.out.println("Child 클래스의 default 메서드");
MyInterface1.super.defaultMethod();
MyInterface2.super.defaultMethod();
}
}
**DefaultStaticEx.java**
package chapter09;
public class DefaultStaticEx {
public static void main(String[] args) {
Child c = new Child();
c.defaultMethod();
c.method2();
MyInterface1.staticMethod();
MyInterface2.staticMethod();
}
}
===== 어노테이션 =====
**UserAnnot.java**
package chapter09;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnot {
String value();
int number() default 5;
}
**UserClass.java**
package chapter09;
public class UserClass {
@UserAnnot(value="A")
public void methodA() {
System.out.println("methodA() 실행");
}
@UserAnnot(value="B", number=10)
public void methodB() {
System.out.println("methodB() 실행");
}
}
**AnnotationEx.java**
package chapter09;
import java.lang.reflect.Method;
public class AnnotationEx {
public static void main(String[] args) throws Exception {
Method method[] = UserClass.class.getDeclaredMethods();
for (int i=0; i