[Java] - 자바 인터페이스, 다중 인터페이스, 인터페이스의 사용방법

 인터페이스는 .java형태의 소스파일로 작성되고 컴파일러(javac)를 통해 .class 형태로 컴파일되기 때문에 물리적 형태는

클래스와 동일하다.

 

그러나 선언 하는 방법은 다르다.

 

-인터페이스 선언방법

public interface 인터페이스명 {}

 

 

 클래스는 필드, 생성자, 메소드로 구성되어지는 반면에 인터페이스는 상수필드, 추상메소드으로만 구성되어진다.

상수는 public static final로 선언하기 때문에 public static final을 생략하더라도 컴파일과정에서 자동으로 붙게된다.

 

[public static final 타입 상수명 = 값;

 

-인터페이스 예제

 예시로 리모컨이라는 인터페이스를 선언하고 그에 따른 TV, Audio 라는 구현 클래스를 작성해보도록 한다.

 

1. 인터페이스 및 추상메소드 선언

 리모컨이라는 인터페이스를 선언하고 리모컨을 통해서 각 구현객체들이 공통적으로 수행할 수 있는 메소드, 즉 추상메소드를 선언해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package chapter08;
 
public interface RemoteControl {
    
    //상수
    public int max_volume = 10;
    public int min_volume = 0;
    
    //추상 메소드
    public void turnOn();
    public void turnOff();
    public void setVolume(int volume);
    
    default void display() {
        System.out.println("화면출력");
    }
    
    static void test() {
        
    }
    
}
cs

 

2. 인터페이스 구현 ( 구현클래스, 구현 객체)

구현 클래스는 보통의 클래스와 동일하면서도 인터페이스 타입으로 사용할 수 있음을 알려주기 위해 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야한다.

 

아래의 코드는 Tv와 Audio 라는 구현 클래스를 작성한 것이다.

 

 

#TV 인터페이스

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
package chapter08;
 
public class Television implements RemoteControl {
    
    private int volume;
    Television(){
        
    }
 
    @Override
    public void turnOn() {
        System.out.println("\ttv를 켭니다");
 
    }
 
    @Override
    public void turnOff() {
        System.out.println("\ttv를 끕니다");
 
    }
 
    @Override
    public void setVolume(int volume) {
        if(volume > RemoteControl.max_volume) {
            this.volume = RemoteControl.max_volume;}
            else if(volume < RemoteControl.min_volume) {
                this.volume = RemoteControl.min_volume;
            } else {
                this.volume = volume;
        }
        System.out.println("\t현재 Tv 볼륨 : " + this.volume);
    }
}
 
 
cs

 

# Audio 인터페이스

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
package chapter08;
 
public class Audio implements RemoteControl {
    
    //필드
    private int volume;
    @Override
    public void turnOn() {
        System.out.println("\tAudio를 켭니다");
 
    }
 
    @Override
    public void turnOff() {
        System.out.println("\tAudio를 끕니다");
 
    }
 
    @Override
    public void setVolume(int volume) {
        if(volume > RemoteControl.max_volume) {
            this.volume = RemoteControl.max_volume;}
            else if(volume < RemoteControl.min_volume) {
                this.volume = RemoteControl.min_volume;
            } else {
                this.volume = volume;
        }
        System.out.println("\t현재 Audio 볼륨 : "+this.volume);
 
    }
 
}
 
cs
 

 

3. 인터페이스 변수에 구현객체 대입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package chapter08;
 
public class RemoteControl_example {
 
    public static void main(String[] args) {
        
        RemoteControl rc; // 인터페이스 변수선언
        rc = new Television(); // 인터페이스 변수에 구현 객체 대입
        rc.turnOn();
        rc.turnOff();
        
        rc = new Audio(); // 인터페이스 변수에 구현 객체 대입
        rc.turnOn();
        rc.turnOff();
        
        
 
    }
 
}
 
 
cs

 

- 실행결과

 

# 인터페이스의 사용방법

구현 객체가 인터페이스 변수에 대입이 가능하므로 인터페이스로 구현 객체를 사용하는 방법은 다음과 같다.

 

1. 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.

 

2. 인터페이스가 생성자의 매개 변수타입으로 사용될 경우 new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.

 

3. 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.

 

4. 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우, 메소드 호출 시 구현객체를 매개값으로 대입할 수 있다.

 

원리는 간단하다. 구현객체가 인터페이스 변수에 대입이 가능하므로 위 모든 사항이 적용된다.

 

(예제코드)

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
package chapter08;
 
public class MyClass {
    //필드
    RemoteControl rc = new Television();
    
    //생성자
    MyClass(){ // 기본생성자
        
    }
    
    MyClass(RemoteControl rc){
        this.rc = rc;
        rc.turnOn();
        rc.setVolume(5);
    }
    
    //메소드내의 지역변수
    void methodA() {
        RemoteControl rc = new Audio();
        rc.turnOn();
        rc.setVolume(5);
    //메소드의 매개변수    
    }
    
    void methodB(RemoteControl rc) {
        rc.turnOn();
        rc.setVolume(5);
    }
}
 
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
package chapter08;
 
public class MyClass_example {
 
    public static void main(String[] args) {
        System.out.println("------------1. 인터페이스를 필드 타입으로 사용하여 필드에 구현 객체 대입------------");
        MyClass myc1 = new MyClass();
        
        myc1.rc.turnOn();
        myc1.rc.setVolume(5);
        
        System.out.println("\n\n------------2. 인터페이스를 생성자의 매개변수 타입사용하여 매개변수에 구현 객체 대입------------");
        MyClass myc2 = new MyClass(new Audio());
        
        System.out.println("\n\n------------3. 인터페이스를 로컬 변수의 타입으로 사용하여 로컬변수에 구현 객체 대입 ------------");
        MyClass myc3 = new MyClass();
        myc3.methodA();
        
        System.out.println("\n\n------------4. 인터페이스를 메소드의 매개 변수탑으로 사용하여 매개변수에 구현객체 대입------------");
        MyClass myc4 = new MyClass();
        myc4.methodB(new Television());
        
 
    }
 
}
 
cs