자바의 정석 7장 (17일차) - 인터페이스를 이용한 다형성 및 장점

728x90

인터페이스를 자손 클래스로 만들기

아래와 같이 abstract 클래스는 extends로 연결하고 implements로 인터페이스 자손으로 연결

class Fight extends Unit implements marine{ //인터페이스를 implements로 묶어 손자 클래스로 변환
	int x;
	int y;
}    
abstract class Unit{
}

interface marine{
	void move(int x, int y);
	void attact();

인터페이스 장점

두 대상(객체)간의 연결, 대화, 소통을 돕는 중간역활

아래와 같이 선언(설계 - 껍데기)와 구현(실행 - 알맹이)을 분리시킬 수 있게 도와줌

  • 즉 붙어있는 경우 변경이 불리하지만, 아래처럼 따로 분리되있는 경우 알맹이만 바꿀 수 있으므로 변경에 유리
  • =유연한 코드(인터페이스 덕분에 submethod를 바꾸더라도 method는 유지 가능
class method implements submethod{ //클래스 + 알맹이
	public void play() {
	}
}

interface submethod{ //껍데기
	public void play();
}

 

아래는 인터페이스 없이 직접적으로 연결된 클래스이다.

직접적으로 연결되 있기 때문에 처리는 빠르지만 수정 시 코드를 뜯어고쳐야 한다는 단점이 있음

package Lecture;

class A{
	public void method(B b) { //여기를 바꿔야 가능, 의존하는 경우
		b.method();
	}
}

class B{
	public void method() {
		System.out.println("B클래스의 메서드");
	}
}

class C{
	public void method() {
		System.out.println("C클래스의 메서드");
	}
}

public class InterfacePolymorphism {
	public static void main(String[] args) {
		A a = new A();
		a.method(new B()); //B클래스 호출
	}
}

 

아래는 인터페이스(껍데기)를 통해 느슨하게 연결된 형태로 수정 시 클래스 A만 변경하면 된다는 장점이 있다.

package Lecture;

class A{
	public void method(I i) { //여기를 바꿔야 가능, 의존하는 경우
		i.method();
	}
}


// B클래스의 선언과 구현을 분리 
interface I{
	public void method();
}


class B implements I{//인터페이스를 둘다 지원하므로 아래 메인클래스만 변경해주면 편하게 사용 가능
	public void method() {
		System.out.println("B클래스의 메서드");
	}
}

class C implements I{ //인터페이스를 둘다 지원하므로 아래 메인클래스만 변경해주면 편하게 사용 가능
	public void method() {
		System.out.println("C클래스의 메서드");
	}
}

public class InterfacePolymorphism {
	public static void main(String[] args) {
		A a = new A();
		a.method(new C()); //B클래스 호출
//		인터페이스 호출 시 이 기능만 바꿔주면 맨 상단 A는 바꿀필요 없음
	}
}

 

관계없는 클래스들끼리 연결시켜줄 수 있다

 

  • 지상유닛과 공중유닛의 수리 interface를 제작하여 각각 다른 모체 클래스에 속해있는 유닛들의 코드를 간결화 시킬 수 있음
  • 아래의 코드처럼 만약 repairable 클래스가 Unit이라는 모체클래스에 속해있지 않다면 출력을 하지 않는 코드로 만들수도 있음
class scv extends Unit implements repairable{
	int health = 100;

	public void repair(repairable r) {
		if(r instanceof Unit){
			while(health!=100) {
				health++;
			}
		}
	}
}
class dropship extends Unit implements repairable{
	int health = 200;

	public void repair(repairable r) {
		if(r instanceof Unit){
			while(health!=200) {
				health++;
			}
		}
	}
}
728x90