인터페이스

  • 서로 관계가 없는 물체들이 상호작용 하기 위해
  • 실제 클래스만 상관없이 규약만 맞으면 어디든 저장 상관 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

+ Recent posts