interface Printable {
public abstract void print(String doc);
}
public class InterfaceTest {
public static void main(String[] args) {
String myDoc = "This is a report about...";
// 삼성 프린터로 출력
Printable prn = new SPrinterDriver();
prn.print(myDoc);
System.out.println();
// LG 프린터로 출력
prn = new LPrinterDriver();
prn.print(myDoc);
}
}
======================================================
interface Printable {
void print(String doc);
}
class SPrinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("삼성 프린터로 출력: " + doc);
}
}
class LPrinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("LG 프린터로 출력: " + doc);
}
}
public class printtext2 {
public static void main(String[] args) {
String myDoc = "This is a report about...";
Printable prn = new SPrinterDriver();
prn.print(myDoc);
System.out.println();
prn = new LPrinterDriver();
prn.print(myDoc);
}
}
Circle, Rectangle , Triangle
interface AreaGetable {
public double getArea();
}
public static void main(String[] args) {
AreaGetable area = new Circle(4);
System.out.println(area.getArea());
area = new Rectangle(4,5);
System.out.println(area.getArea());
area = new Triangle(4,5);
System.out.println(area.getArea());
}
======================================================
interface AreaGetable {
double getArea();
}
class Circle5 implements AreaGetable {
private double radius;
public Circle5(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
class Rectangle5 implements AreaGetable {
private double width;
private double height;
public Rectangle5(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
}
class Triangle5 implements AreaGetable {
private double base;
private double height;
public Triangle5(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double getArea() {
return 0.5 * base * height;
}
}
public class printtext2 {
public static void main(String[] args) {
AreaGetable area = new Circle5(4);
System.out.println(area.getArea());
area = new Rectangle5(4,5);
System.out.println(area.getArea());
area = new Triangle5(4,5);
System.out.println(area.getArea());
}
}
디폴트 메소드: 디폴트 메소드는 인터페이스에서 제공하는 메소드로, 기본 구현을 가집니다. 이 메소드는 인터페이스를 구현하는 클래스에서 오버라이드할 수 있지만, 오버라이드하지 않아도 됩니다. 디폴트 메소드는 자바 8에서 도입되었으며, 기존 인터페이스를 변경하지 않고도 새로운 기능을 추가할 수 있게 해줍니다.
인터페이스를 상속하는 방법: 인터페이스는 다른 인터페이스를 상속할 수 있습니다. 이는 extends 키워드를 사용하여 수행됩니다. 인터페이스가 다른 인터페이스를 상속하면, 상속받는 인터페이스는 상위 인터페이스의 모든 추상 메소드를 상속받습니다. 또한, 인터페이스는 여러 인터페이스를 동시에 상속할 수 있습니다. 이는 클래스와 달리 인터페이스는 다중 상속을 지원하기 때문입니다.
class A {
private int a;
protected A(int i) { a = i; }
}
class B extends A {
private int b;
public B() { b = 0; }
}
class A {
private int a;
protected A(int i) { a = i; }
}
class B extends A {
private int b;
public B() {
super(0); // 클래스 A의 생성자 호출
b = 0;
}
}
(1)abstract class A {
void f();
}
(2)abstract class A {
void f() { System.out.println("~"); }
}
(3)abstract class B {
abstract void f();
}
class C extends B {
}
(4)abstract class B {
abstract int f();
}
class C extends B {
void f() { System.out.println("~"); }
}
추상 클래스의 선언이나 사용에 대한 문제는 다음과 같습니다:
abstract class A {
abstract void f();
}
abstract class B {
abstract void f();
}
class C extends B {
void f() { /* 구현 내용 */ }
}
abstract class D {
abstract int f();
}
class E extends D {
int f() { /* 구현 내용 */ return 0; }
}