[Java] OOP_인터페이스(Interface)

jeong·2021년 6월 13일
0

Java 자바

목록 보기
26/28

인터페이스(Interface)

모든 멤버가 추상메소드인 타입, new 할 수 없음
추상클래스의 일종으로 추상클래스보다 인터페이스가 추상화 정도가 높다.

  • 실제 구현된 것이 전혀 없는 기본 설계도
  • 추상메소드와 상수만 멤버로 가질 수 있음
  • 인스턴스 생성할 수 없음
  • 클래스 작성에 도움을 줄 목적으로 사용

인터페이스의 작성

class 대신 interface를 사용한다는 것만 다르고 클래스 작성방법과 동일하다
interface 인터페이스명 {
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수목록);
}

  • 구성요소 : 추상메소드와 상수만 가능함
    1) 모든 멤버변수는 public static final이여야 하고 생략가능하다.
    2) 모든 메소드는 public abstract, 생략가능하다.
interface Shape2 { // 인터페이스 : 모든 멤버가 추상메소드인 타입, new 할 수 없음 
	String VERSION = "1.0"; // --> public static final String VERSION="1.0"
	void draw(); // --> abstract public void draw();
}

인터페이스의 상속

인터페이스도 클래스처럼 상속이 가능하다.
-> 클래스와 달리 다중 상속 허용
인터페이스는 Object클래스와 같은 최고 조상이 없다.

interface Moveable {
	void move(int x, int y);
}

interface Attackable {
	void attack(Unit u);
}

interface Fightable extends Moveable, Attackable { }

인터페이스의 구현

인터페이스를 구현하는 건 클래스를 상속받는 것과 같다
대신 extends 대신 implements를 사용한다

  • 인터페이스에 정의된 추상메소드를 완성해야함
  • 상속과 구현 동시 가능
interface Shape2 { // 인터페이스 
	String VERSION = "1.0"; // --> public static final String VERSION="1.0"
	void draw(); // --> abstract public void draw();
}

class Rect2 implements Shape2 {
	
	public void draw() {	
		System.out.println("Draw Rect");
	}
}
class Oval2 implements Shape2 {
	
	public void draw() {	
		System.out.println("Draw Oval");
	}
}
class Line2 implements Shape2 {
	
	public void draw() {	
		System.out.println("Draw Line");
	}
}

public class Ex04Interface {
	public static void main(String[] args) {
		//1. 인터페이스는 인스턴스 생성 X
		//Shape2 shape2 = new Shape2();
		
		//2. 인터페이스 타입의 참조변수는 만들 수 있습니다. 
		Shape2 shape = null;
		
		//4. 인터페이스 사용 -> 다형성 적용 
		ArrayList<Shape2> shapes = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			if (i % 3 == 0) {
				shapes.add(new Rect2());
			} else if (i % 3 == 1) {
				shapes.add(new Oval2());
			} else {
				shapes.add(new Line2());
			}
		}
		for(Shape2 s : shapes) {
				s.draw(); //다형성 : 같은 메소드 호출 코드가 인스턴스에 따라 다른 동작 수행 
		}
		
	}
}

인터페이스 다형성

1) 인터페이스 타입 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
2) 인터페이스를 메소드의 매개변수 타입으로 지정할 수 있다.

void attack(Fightable f) { //Fightable인터페이스 구현한 클래스의 인스턴스를 매개변수로 받는 메소드 

}

3) 인터페이스를 메소드 리턴타입으로 지정할 수 있다.

Fightable method() { //Fightable인터페이스 구현한 클래스의 인스턴스를 반환
	return new Fighter();
}

profile
배우는 초보개발자

0개의 댓글