인터페이스

인터페이스

인터페이스

서로 관계가 없는 물체들이 상호작용 하기 위해

실제 클래스만 상관없이 규약만 맞으면 어디든 저장 상관 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