본문 바로가기

개발

Java - 인터페이스

반응형

인터페이스란 ?
 - *핵심! 추상 메서드의 집합 - 프로그래밍 관점
 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아니다)
 다중 상속이 가능(추상메서드는 충돌해도 문제 없음)
    ** 클래스의 다중상속이 안되는 이유는 ? : 다른 조상에서 같은 이름. 같은 일을 하는 메소드가 있을 수 있어서 안된다 / 그러나 인터페이스는 어차피 구현부만 있기 때문에 문제가 되지 않는다)

 

interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;// 상수는 가질 수 있다.
    public abstract 메서드이름(매개변수목록);
}

interface PlayingCard {
	public static final int SPADE = 4;
    final int DIAMOND = 3;	// public static final 생략
    static int HEART = 2;	// public static final 생략
    int CLOVER = 1;			// public static final 생략
    
    public abstract String getCardNumber();
    String getCardKind(); // public static final 생략
}

 

인터페이스의 구현 
 - 인터페이스에 정의된 추상 메서드를 완성 하는 것 
 ** implements : 구현

class 클래스이름 implements 인터페이스이름{
	// 인터페이스에 정의된 추상 메서드를 구현
}

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

class Fighter implements Fightable {
	public void move(int x, int y);{}
    public void attack(int x, int y);{}
}

 - 일부만 구현 하는 경우는 class 앞에 abstract를 붙여야 한다.

abstract class Fighter implements Fightable {
	public void move(int x, int y){ }
}

** 추상클래스 <> 인터페이스 공통점
 - 추상 메서드를 가지고 있다.(미완성 설계도) 

** 추상클래스 <> 인터페이스 차이
 - iv를 가질수 있느냐 없느냐의 차이 
 - 추상클래스 : 추상 메서드를 가진 클래스 / 멤버변수를 가질 수 있다. / 구현이 있을 수 있다.
 - 인터페이스 : 추상 메서드만 있다. / 멤버변수를 가질 수 없다. / 구현이 없다.

인터페이스를 이용한 다형성 
 - 인터페이스도 구현 클래스의 부모? YES!!!

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

// 다형성
Unit 		u = new Fighter();
Fightable 	u = new Fighter(); // 대신 Fightable에 있는 메서드만 사용 가능

 - 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능 

f.move(100, 200);
f.attack(new Fighter()); // Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능

 - 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

Fightable method(){
	...
    Fighter f = Fighter();
    return f;
}

Fightable ff = method();

 

인터페이스의 장점
 - 두 대상(객체) 간의 '연결, 대화, 소통' 을 돕는 '중간 역할'을 한다.
 - 선언(설계)와 구현을 분리시킬 수 있게 한다.
 - 인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다. 변경에 유연하다. (느슨한 결합)

  ** 직접적인 관계(강한결합)

class A { 
	public void method(B b){
    	b.methodB();
    }
}
class B{
	public void methodB(){
    	System.out.println("methodB");
	}
}

 

 ** 간접적인 관계 

class A { 
	public void method(I b){
    	b.methodB();
    }
}
interface I { void methodB();}

class B implements I{
	public void methodB(){
    	System.out.println("methodB");
	}
}

 추후 새로운 클래스 C가 추가된다면 인터페이스를 이용할 경우 A클래스는 변경 할 필요가 없다. 

class C implements I{
	public void methodB(){
    	System.out.println("methodB is C");
    }
}

 - 개발 시간을 단축 할 수 있다.
  인터페이스를 사용하지 않으면 그 해당 클래스, 기능이 완성되기 전 까지 그 기능을 이용하는 부분은 개발 하지 못하지만
  인터페이스를 사용할 경우 기능이 구현 전이라도 그 기능을 이용하는 부분은 개발이 가능하다. 
  위의 소스를 예로 하면 B클래스가 구현 전이라도 인터페이스 I 를 이용해 A 클래스 구현이 가능 
 - 변경에 유연한 설계가 가능하다.
 - 표준화가 가능하다. JDBC 
 - 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.
  

디폴트 메서드와 static 메서드 
 - 인터페이스의 디폴트 메서드, static 메서드 추가 가능(JDK 1.8부터)
 - 인터페이스에 새로운 메서드 추가하기 어려움
    메서드를 추가하면 기존에 그 인터페이스를 이용해 구현된 클래스에 영향이 있음.
    해결책 >> 디폴트 메서드(default method) 
 - 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)

interface MyInface {
	void method();
    void newMethod(); // 새로추가된 메서드 기존 구현된 클래스에 영향을 줌
}

interface MyInface {
	void method();
    default void newMethod(){} // 몸통이 있는 default 메서드 추가 구현 안해도 됨
}

 >> 그러면 디폴트 메서드가 기존의 메서드와 충돌하면 어떻게 하지 ??
  1. 여러 인터페이스와 디폴트 메서드 간의 충돌 
      : 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야한다.
  2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
      : 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
 >>> 그냥 충돌 났을때 오버라이딩 하면 된다. 

반응형

'개발' 카테고리의 다른 글

Java - 오류 / 예외 처리하기  (0) 2021.06.05
Java - 내부 클래스(inner class) / 익명 클래스(anonymous class)  (0) 2021.06.05
Java - 추상클래스  (0) 2021.06.05
Java - 객체지향개념  (0) 2021.05.30
Java - 배열  (0) 2021.05.10