1. 인터페이스

- 일종의 추상클래스이다. 그러나 추상클래스보다 추상화 정도가 높다.

- 실제로 구현된 것이 전혀 없는 기본 설계도에 비유한다.

- 상수와 추상메소드만을 멤버로 가질 수 있다.

- 인스턴스를 생성할 수 없고, 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하고, 클래스 작성에 도움을 줄 목적으로 사용한다.


2. 인터페이스의 작성

- 'class' 대신 'interface'를 사용한다는 것 외에는 클래스를 작성하는 것과 같다.

- 구성요소는 상수와 추상메소드만 가능하다.

- 모든 멤버변수는 public, static, final 이어야 하고, 생략할 수 있다.

- 모든 메서드는 public, abstract 이어야 하고, 생략 할 수 있다.

public interface Test {
	public static final double PI = 3.14;
	final  int x = 1;	// public static final int x = 1;
	static int y = 2;	// public static final int y = 2;
	int z = 3;			// public static final int z = 3;
	
	public abstract String getNumber();
	String getPI();	// public absract String getPI();
} // Test

3. 인터페이스의 상속

- 인터페이스로부터만 상속받을 수 있으며, 다중상속이 가능하다.

- 인터페이스는 Object 클래스와 같은 최고 조상이 없다.


4. 인터페이스의 구현 및 다형성

- 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지않다. 다만 'extends' 대신 'implements'를 사용한다.

- 인터페이스에 정의된 추상메소드를 완성해야 한다.

interface Movable {
	void move(int x, int y); // 지정된 위치(x, y)로 이동하는 기능의 메소드
} // Movable

interface Attackable {
	void attack(Unit u); // 지정된 대상(u)을 공격하는 기능의 메서드
} // Attackable

interface Fightable extends Movable, Attackable {
} // Fightable extends Movable, Attackable

class Unit {
	int currentHP;	// 유닛의 체력
	int x;				// 유닛의 위치 (x좌표)
	int y;				// 유닛의 위치 (y좌표)
} // Unit

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) {}
	public void attack(Unit u) {}
}
public class FighterTest {
	public static void main(String[] args) {
		Fighter fighter = new Fighter();
		
		if (fighter instanceof Unit) {
			System.out.println("fighter는 Unit 클래스의 자손입니다.");
		}
		
		if (fighter instanceof Fightable) {
			System.out.println("fighter는 Fightable 인터페이스를 구현했습니다.");
		}
		
		if (fighter instanceof Movable) {
			System.out.println("fighter는 Movable 인터페이스를 구현했습니다.");
		}
		
		if (fighter instanceof Attackable) {
			System.out.println("fighter는 Attackable 인터페이스를 구현했습니다.");
		}
		
		if (fighter instanceof Object) {
			System.out.println("fighter는 Object 클래스의 자손입니다.");
		}
	} // main
} // FighterTest

/*
 * 결과
 * 
 * fighter는 Unit 클래스의 자손입니다.
 * fighter는 Fightable 인터페이스를 구현했습니다.
 * fighter는 Movable 인터페이스를 구현했습니다.
 * fighter는 Attackable 인터페이스를 구현했습니다.
 * fighter는 Object 클래스의 자손입니다.
 * 
 */

5. 인터페이스를 이용한 다중상속

- 두 개의 클래스로부터 상속을 받아야 할 상황이라면, 두 조상클래스 중에서 비중이 높은 쪽을 선택하고 

다른 한쪽은 클래스 내부에 멤버로 포함시키는 방식으로 처리하거나 어느 한쪽의 필요한 부분을 뽑아서 인터페이스로 만든 다음 구현한다.


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

- 인터페이스의 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.

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

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


7. 인터페이스 장점

- 개발시간을 단축시킬 수 있다.

- 표준화가 가능하다.

- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

- 독립적인 프로그래밍이 가능하다.


8. 인터페이스의 이해

- 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.

- 선언(설계)과 구현을 분리시키는 것을 가능하게 한다.

- 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.

- 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.

+ Recent posts