본문 바로가기
객체지향 OOP

[자바의정석 기초 객체지향 개념] 인터페이스

by bzerome240 2022. 5. 31.

인터페이스

: 추상 메서드의 집합

: 구현된 것이 전혀 없는 설계도 (모든 멤버가 public)

interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;
	public abstract 메서드이름(매개변수);
}

class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}

 

예제

interface PlayingCard {
	public static final int SPADE = 4;
	final int DIAMOND = 3; // public static final int DIAMOND = 3;
	static int HEART = 2;  // public static int HEART = 2;
	int CLOVER = 1;

	public abstract String getCardNumber();
	String getCardKind();  // public abstract String getCardKind();
}

 

인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능
  • 다중 상속이 가능 (추상메서드는 충돌해도 문제 없음)
interface Fightable extends Movable, Attackable {}

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

interface Attackable {
	void attack(int x, int y);
}
💡
Q. 인터페이스란? A. 추상 메서드의 집합 (외우기!)
Q. 인터페이스의 구현이란? A. 인터페이스의 추상메서드 몸통 만들기 (미완성 설계도 완성하기)
Q. 추상클래스와 인터페이스의 공통점은? A. 추상메서드를 가지고 있다 (미완성 설계도)
Q. 추상클래스와 인터페이스의 차이점은? A. 인터페이스는 iv를 가질 수 없다 (인스턴스 변수)

 


 

인터페이스를 이용한 다형성

  • 인터페이스도 구현 클래스의 부모이다
  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능하다
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
Fightable method() {
	...
	Fighter f = new Fighter();
	return f;
}

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { ... }
	public void attack(Fightable f) { ... }
}

 


 

인터페이스의 장점

  1. 두 대상(객체) 간의 연결, 대화, 소통을 돕는 ‘중간 역할’을 한다.
  2. 선언(설계)와 구현을 분리 시킬 수 있게 한다. (느슨한 결합)
  3. 변경을 최소화할 수 있다.
class a {
	public void method() {
		System.out.println("rr");
	}
}
interface I {
	public void method();
}
class a implements I {
	public void method() {
		System.out.println("rr");
	}
}

 

직접적인 관계의 A-B 클래스

class A {
	public void methodA(B b) {
		b.methodB();
	}
}
class B {
	public void methodB() {
		System.out.println("methodB()");
	}
}
class InterfaveTest {
	public static void main(String args[]) {
		A a = new A();
		a.methodA(new B());
	}
}

 

간접적인 관계의 A-B 클래스

// I를 사용하면서 B와 관계가 없어짐
class A {
	public void methodA(I i) {
		i.methodB();
	}
}
// B클래스를 I와 B로 분리함
interface I {
	void methodB();
}

class B implements I {
	public void methodB() {
		System.out.println("methodB()");
	}
}
// 나중에 B를 C로 변경해도 A는 변경할 필요가 없다
class C implements I {
	public void methodB() {
		System.out.println("methodB() in C");
	}
}
  1. 개발 시간을 단축할 수 있다.
    • ex) A클래스가 B클래스 작성되지않아도 인터페이스(껍데기)를 이용해서 코드를 작성할 수 있다.
  2. 변경에 유리한 유연한 설계가 가능하다
    • ex) B클래스를 C클래스로 바꿀 수 있다. A는 변경하지 않아도 된다.
  3. 표준화가 가능하다.
    • ex) JDBC (표준 인터페이스 집합)
  4. 서로 관계없는 클래스들 관계를 맺어줄 수 있다.
interface Repairable {}

// 세클래스가 Repairable 인터페이스를 구현한다
class SCV extends GroundUnit implements Repairable { ... }

class Tank extends GroundUnit implements Repairable { ... }

class Dropship extends GroundUnit implements Repairable { ... }

 


 

인터페이스 default 메서드, static 메서드

  • 인터페이스에 새로운 메서드(추상메서드)를 추가하기 어려움 → default 메서드 사용하여 해결
interface My {
	void method();
	default void newMethod() {}
}

 

default 메서드가 기존 메서드와 충돌할 때 해결방법

  1. 여러 인터페이스의 디폴트 메서드 간의 충돌

→ 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 한다.

  1. 디폴트 메서드와 조상 클래스의 메서드간의 충돌

→ 조상 클래스의 메서드가 상속되고 default 메서드는 무시된다.

 

 

728x90
반응형

댓글