1. 인터페이스 (Interface)


# 메소드들의 원형만 나열된 것, 일종의 명세서 


1) 특징

(1) interface 키워드를 사용해서 작성한다.

(2) 메소드들의 몸통은 인터페이스를 구현하는 클래스에서 반드시 구현해야 한다.

* 인터페이스와 클래스 사이의 관계를 구현이라고 함

* 구현 클래스: 인터페이스를 구현하는 클래스 


(3) 인터페이스는 구현 클래스를 제어하기 위한 목적으로 사용된다. 


2) 구조 

(1) 일반 클래스    

class 클래스명 {

변수;

메서드;

}


(2) 추상 클래스

abstract class 클래스명 {
       변수;

메서드;

추상 메서드;

}


(3) 인터페이스

interface 인터페이스명 {
       상수;

추상 메서드;

}



2) 추상 클래스와의 공통점

- 스스로 객체가 될 수 없으며 인터페이스를 구현하는 클래스만이 객체가 될 수 있다. 


3) 추상 클래스와의 차이점 

- 인터페이스는 개념만 정리된 것이지만 추상 클래스는 개념과 일부 기능이 존재한다.

- 인터페이스는 추상 메소드와 상수만 선언할 수 있으며, 상속할 내용은 따로 없다. 



4) implements 키워드를 사용하여 클래스에서 인터페이스를 구현한다. 





- 인터페이스는 상속 개념이 아닌 구현 개념으로 추상 메소드를 구현한다. 

- implements: 구현 클래스와 인터페이스의 관계를 설정하기 위해 사용된다. 




2. 인터페이스의 특징 


1) interface 키워드를 사용해서 작성한다. 

2) 인터페이스는 추상 메소드와 final static 으로 선언된 상수를 포함할 수  있다.

3) 인터페이스를 인스턴스화해서 객체로 만들 수 없다.

4) 인터페이스는 인터페이스끼리 extends 키워드로 상속받을 수 있다.

단, 클래스와 다르게 여러 개의 인터페이스로부터 다중 상속을 받을 수 있다.

5) 클래스는 implements 키워드로 인터페이스를 구현할 수 있다.

6) 클래스는 인터페이스와 메소드를 동시에 상속 및 구현할 수 있다. 

7) 인터페이스에서는 abstract 키워드를 생략해도 괜찮다. 



3. 인터페이스의 다중 상속



1) 인터페이스는 인터페이스끼리 상속 관계를 맺을 수 있지만 클래스와 달리 다중 상속이 가능하다.

2) 구현되어 있는 실행부가 없기 때문에 다중 상속을 해도 모호성이 없다.

3) 구현 클래스에서 다중 상속된 메소드를 구현할 때 실제로 어떤 인터페이스의 것을 구현하는지 구별하지 않아도 된다. 

* 단지 추상 클래스의 기능만 수행하면 된다. 


4) 하나의 구현 클래스에서 여러 개의 인터페이스를 다중 구현하는 방법



- 인터페이스는 클래스의 상속과 달리 구현 클래스가 여러 개의 인터페이스를 구현하는 다중 구현이 가능하다. 

* 다중 상속과 다중 구현은 다르다. 


5) 클래스 상속과 인터페이스를 동시에 구현하는 방법 





- 클래스는 인터페이스 구현과 클래스 상속을 동시에 수행할 수 있다. 

- 클래스는 extends 키워드를 통하여 부모 클래스로부터 상속을 받을 수 있으며, implements 키워드를 통하여 인터페이스와 구현 관계를 맺을 수 있다. 



4. 인터페이스를 사용하는 이유 


1) 개발시간을 단축할 수 있다.

- 인터페이스를 통해 작성한 클래스를 토대로 다른 개발자들과 동시에 개발을 진행할 수 있다.


2) 시스템을 구성하는 클래스들을 효율적으로 디자인할 수 있다. 



예를 들어 데이터를 관리하는 시스템을 개발했다고 하자. 이 시스템은 Oracle 데이터베이스를 사용하는 A 고객사에게 설치되었다. 

이때 MySQL 데이터베이스를 사용하는 B 고객사에도 설치해야 하는 상황이 발생했다. 그렇다면 프로그램을 다시 개발해야 하는 것일까?


위의 그림은 프로그램의 일부분을 도식화한 것이다. 시스템 디자이너는 데이터베이스에 데이터를 쿼리해오는 부분을 인터페이스로 선언한다.

그래서 시스템에서 필요한 데이터를 뽑아오는 추상 메소드로 인터페이스를 구성하고, 각 데이터베이스의 버전에 맞는 구현 클래스를 개발하면 된다. 

그러면 A사는 Oracle 구현 클래스로 데이터를 쿼리하고, B사는 MySQL 구현 클래스로 데이터를 쿼리하면 된다. 

이렇게 데이터베이스 종류에 맞는 인터페이스를 개발하면 좀더 쉽게, 구조적으로 편리하게 클래스를 디자인할 수 있다. 


3) 정형화된 틀 안에서 클래스를 개발할 수 있다. 

- 위의 그림과 같이 business logic 부분은 데이터를 쿼리하기 위해서 항상 같은 메소드를 사용하면 된다. 

- 내용은 서로 다르더라도 인터페이스라는 하나의 정형화되어 있는 틀 안에서 여러 클래스를 개발할 수 있다. 


4) 서로 관계 없는 클래스끼리 관계를 맺을 수 있다. 

- 인터페이스는 추상 메소드의 선언부만 공유를 하고 구현부는 각각 다르기 때문에 서로 상관 없는 클래스끼리 관계를 맺기에 편리하다.



5. 추상 클래스와 인터페이스 비교


1) 추상 클래스와 인터페이스는 내부에 선언된 추상 메소드를 갖고 있으므로,

자기 자신을 인스턴스화해서 객체로 사용할 수 없다.

2) 반드시 자식 클래스나 구현 클래스를 통해서 자신의 기능을 사용할 수 있다.

3) 추상 클래스나 인터페이스 모두 객체 지향 프로그래밍의 다형성을 잘 보여준다.

4) 추상 클래스는 인터페이스와 달리 클래스 내부에 완전한 형태의 메소드와 일반 변수를 선언해서 사용할 수 있다.

즉, 추상 클래스는 좀더 클래스에 가까운 성질을 가지고 있으며,

인터페이스는 내부에 추상 메소드의 선언부와 static final 제어자로 선언된 상수만 선언할 수 있다.

5) 인터페이스는 자바 클래스의 단일 상속(extends) 특징과 달리 다중 구현(implements)을 할 수 있다. 

6) 추상 클래스에 있는 일반 메서드가 필요없는 경우에도 추상 클래스를 상속받게 되면, 

자식 클래스는 필요하지 않는 추상 클래스의 멤버들을 가져올 수 있다. 

이를 방지하기 위해 인터페이스를 사용하여 필요한 것만 가져올 수 있도록 한다. 



# 클래스의 인터페이스 다중 구현 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package interfaceex;
 
interface Sound {
    public static final int MAX_VOLUMN = 10;
    public abstract void turnOn();
    public abstract void turnOff();
}
 
interface Display {
    public abstract void display();
}
 
// 인터페이스는 다중 구현이 가능 
class Video implements Sound, Display {
 
    @Override
    public void display() {}
 
    @Override
    public void turnOn() {}
 
    @Override
    public void turnOff() {}
}
 
public class InterfaceTest02 {
    public static void main(String[] args) {
 
    }
}
cs


# 클래스 상속과 인터페이스 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package interfaceex;
 
interface Phone {
    int BUTTONS = 20;
    void sendCall();
    void receiveCall();
}
 
// 인터페이스 상속 
interface Mobile extends Phone {
    void sendSMS();
    void receiveSMS();
}
 
interface MP3 {
    void play();
    void stop();
}
 
class PDA {
    public int calculate(int x, int y) {
        return x + y;
    }
}
 
class SmartPhone extends PDA implements Mobile, MP3 {
 
    @Override
    public void sendCall() {System.out.println("전화 걸기");}
 
    @Override
    public void receiveCall() {System.out.println("전화 받기");}
 
    @Override
    public void play() {System.out.println("음악 재생");}
 
    @Override
    public void stop() {System.out.println("음악 중지");}
 
    @Override
    public void sendSMS() {System.out.println("SMS 보내기");}
 
    @Override
    public void receiveSMS() {System.out.println("SMS 받기");}
}
 
public class InterfaceTest03 {
    public static void main(String[] args) {
 
        SmartPhone p = new SmartPhone();
        p.sendCall();
        p.receiveCall();
        p.receiveSMS();
        
    }
}
cs