인터페이스
- 서로 관계가 없는 물체들이 상호작용 하기 위해
- 실제 클래스만 상관없이 규약만 맞으면 어디든 저장 상관 X
- 하나 또는 그 이상 클래스들에서 똑같이구현되어질 법한 메서드 선언할 때
- 개발 코드를 수정하지 않고, 가용하는 객체를 변경할 수 있도록
- 부모클래스로 자식 객체 참조 O
- 인터페이스로 구현한 객체를 참조할 수 있다.
- 선언 : interfce "인터페이스명"
- abstract 키워드 지정 안해도 됨 -> 추상메소드만 들어가기 때문
- 다중 implements할 수 있음
추상클래스 | 인터페이스 |
- 상속관계 - "확장" |
상속관계를 해치지 않음 (상속관계 상관 X) 그냥 비슷한 규약(함수) 적용 |
변수명
- 윈도 C++ -> "I인터페이스명"
- java -> "___able"
실습
ShapeApp.java
package com.javaex.oop.shape.v2;
public class ShapeApp {
public static void main(String[] args) {
// shape s = shape(); // 에러 -> 추상 클래스는 객체화 할 수 없다.
Rectangle r = new Rectangle(10, 20, 100, 50);
r.draw();
Circle c = new Circle(10, 10, 30);
c.draw();
Point p = new Point(100,100);
System.out.println("p는 Drawable을 구현했는가?\n" + (p instanceof Drawable ? "Drawalbe 구현 O":"Drawalbe 구현 X"));
}
}
Drawable.java (인터페이스)
package com.javaex.oop.shape.v2;
// 내부에 추상 메서드만 가진다 ( abstract 생략)
public interface Drawable {
public void draw();
}
Rectangle.java
package com.javaex.oop.shape.v2;
public class Rectangle extends Shape implements Drawable{
// 필드
protected int width;
protected int height;
public Rectangle(int x, int y, int width, int height) {
super(x,y);
this.width = width;
this.height = height;
}
// 모두 구현해줘야 한다.
// source -> override/.. 클릭
@Override
public void draw() {
System.out.printf("사각형[x = %d, y = %d, w = %d, h = %d, area = %f]\n",x,y,width, height,area());
}
@Override
public double area() {
return width * height;
}
}
Circle.java
package com.javaex.oop.shape.v2;
public class Circle extends Shape implements Drawable{
protected double r;
public Circle(int x, int y, int r) {
super(x, y);
this.r = r;
}
@Override
public void draw() {
System.out.printf("원[x=%d, y=%d, r=%f, area = %f]을 그렸어요\n", x,y,r,area());
}
@Override
public double area() {
return Math.PI * Math.pow(r, 2);
}
}
Point.java
package com.javaex.oop.shape.v2;
public class Point implements Drawable {
protected int x;
protected int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void draw() {
System.out.printf("점[x=%d, y=%d]을 그렸습니다.\n",x,y);
}
}
shape.java
package com.javaex.oop.shape.v2;
// 추상 클래스
public abstract class Shape {
protected int x;
protected int y;
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
// 추상 클래스는 내부에 반드시 하나 이상의 추상메소드가 있어야
// public abstract void draw(); // 인터페이스에 위임
public abstract double area();
}
결과
사각형[x = 10, y = 20, w = 100, h = 50, area = 5000.000000]
원[x=10, y=10, r=30.000000, area = 2827.433388]을 그렸어요
p는 Drawable을 구현했는가?
Drawalbe 구현 O
- 공통점만 뽑아서 관리하면 상속관계에 상관없이 관리 가능
ShapeApp.java
package com.javaex.oop.shape.v2;
public class ShapeApp {
public static void main(String[] args) {
// shape s = shape(); // 에러 -> 추상 클래스는 객체화 할 수 없다.
Rectangle r = new Rectangle(10, 20, 100, 50);
r.draw();
Circle c = new Circle(10, 10, 30);
c.draw();
Point p = new Point(100,100);
System.out.println("p는 Drawable을 구현했는가?\n" + (p instanceof Drawable ? "Drawalbe 구현 O":"Drawalbe 구현 X"));
// 인터페이스로 구현 객체를 참조할 수 있다.
Drawable[] objs = new Drawable[] {
r,c,p
};
for(Drawable obj : objs) {
obj.draw();
}
}
}
'study > JAVA 전문가' 카테고리의 다른 글
arrays 클래스 (0) | 2021.12.08 |
---|---|
얕은 복제, 깊은 복제 (0) | 2021.12.07 |
예외 (0) | 2021.12.07 |
추상 클래스 (0) | 2021.12.07 |
[모의 필기테스트] 오답노트 & 정리 (0) | 2021.12.07 |