본문 바로가기

프로그래밍/Java

Java_객체지향언어(9)_인터페이스

① 인터페이스 : 구현된 것이 전혀 없는 설계도, 껍데기 ↔ 추상클래스 : 일반클래스, 추상메서드 

 

 

- 인터페이스 선언

interface 인터페이스이름 {
    public static final 타입 상수이름=값;		//상수만 가능. 변수, iv, cv 불가능
    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 abstract 생략가능. 
}

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

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

 

 

- 인터페이스의 상속

: 인터페이스는 인터페이스로부터만 상속받을 수 있고, 다중상속(=조상이 여러개)이 가능하다. 

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

interface Attackable {
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable{}	//다중 상속

→ Fightable에는 정의된 멤버가 하나도 없지만 조상 인터페이스로부터 상속받은 move(), attack()메서드를 멤버로 갖게 된다. 

 

 

- 인터페이스의 구현

: 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없어서 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야 한다. 인터페이스는 구현한다는 의미의 키워드 'implements'를 사용한다. 

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


class Fighter implements Fightable {
    public void move(int x, int y) {/*내용생략*/}
    public void attack(Unit u) {/*내용생략*/}	// {}안 구현부(몸통) 완성.  
}


//만일 인터페이스 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언한다. 
abstract class Fighter implements Fightable {
    public void move(int x, int y) {/*내용생략*/}
}

//상속과 구현을 동시에 할 경우. 
class Fighter extends Unit implements Fightable {
    public void move(int x, int y) {/*내용생략*/}
    public void attack(Unit u) {/*내용생략*/}
}

→ interface + interface => extends

     class + interface => implements

 

 

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

Fightable f=(Fightable)new Fighter();
또는
Fightable f=new Fighter();

→ 인터페이스 Fightable을 클래스 Fighter가 구현했을 때, Fighter인스턴스를 Fightable타입의 참조변수로 참조하는 것이 가능하다. 따라서 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다. 

 

class Fighter extends Unit implements Fightable {
    public void move(int x, int y) {/*내용생략*/}
    public void attack(Fightable f) {/*내용생략*/}	//Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능. 
}

→ 인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야 한다는 것이다. Fighter가 Fightable을 구현했으니 Fighter의 인스턴스를 매개변수로 제공해야 한다.

 

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

→ 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것이다. 

 

 

- 인터페이스의 장점 : 두 대상(객체)간의 연결을 돕는 중간 역할을 함. 

1. 개발시간 단축.

2. 표준화 가능. 

3. 관계없는 클래스들간의 관계를 맺어줌.

4. 독립적인 프로그래밍.

 

class B {
    public void method() {
        System.out.println("method In B");
    }
}

→ 유연하지 않음, 변경에 불리. 

 

interface I {
    public void method();	//I전체
}

class B implements I {
    public void method() {
    	System.out.println("method In B");	//B를 제외한 I의 전체 
    }
}

→ 유연, 변경에 유리. 

 

 

<인터페이스 정리>

Q. 인터페이스란? 

A. 추상메서드의 집합. (+상수, static메서드, 디폴트 메서드)

Q. 인터페이스의 구현이란? 

A. 인터페이스의 추상 메서드 몸통 {} 만들기. (미완성 설계도 완성하기.)

Q. 추상 클래스와 인터페이스의 공통점? 

A. 추상메서드를 가지고 있다.

Q. 추상클래스와 인터페이스의 차이점? 

A. 인터페이스는 인스턴스변수를 가질 수 없다.