on
인터페이스
인터페이스
인터페이스
서로 관계가 없는 물체들이 상호작용 하기 위해
실제 클래스만 상관없이 규약만 맞으면 어디든 저장 상관 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을 구현했는가?
" + (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]
",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]을 그렸어요
", 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]을 그렸습니다.
",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을 구현했는가?
" + (p instanceof Drawable ? "Drawalbe 구현 O":"Drawalbe 구현 X")); // 인터페이스로 구현 객체를 참조할 수 있다. Drawable[] objs = new Drawable[] { r,c,p }; for(Drawable obj : objs) { obj.draw(); } } }
from http://v-ridescent.tistory.com/118 by ccl(A) rewrite - 2021-12-07 12:27:40