인터페이스는 .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 |
'Java' 카테고리의 다른 글
[Java] - 객체비교 (eqauls)에 대해서 (0) | 2020.09.28 |
---|---|
[Java] - ArrayList 객체와 데이터 클래스 객체 연계사용 - 메소드 체이닝(Method Chaining)을 위한 제네릭(Generic)선언 (0) | 2020.09.28 |
[Java] - 추상 메소드와 오버라이딩 ( 메소드 다형성) (0) | 2020.09.24 |
[Java] - 추상 클래스 (0) | 2020.09.24 |
[Java] - Getter, Setter 메소드 (0) | 2020.09.21 |