Day16. 230519
인터페이스
개발 코드와 객체가 서로 통신하는 접점.
- 역할
개발 코드가 객체에 종속되지 않게 객체 교체할 수 있도록 하는 역할.
개발 코드 변경없이 리턴값 또는 실행 내용이 다양해 질 수 있음(다형성)
인터페이스 선언
[public] interface 인터페이스 이름{...}
인터페이스는 상수 필드와 추상 메서드만을 구성멤버로 가짐.
interface 인터페이스이름{
//상수
타입 상수이름 = 값;
//추상 메서드
타입 메서드이름(매개변수,...);
}
상수 필드 선언
- 인터페이스는 상수 필드만 선언 가능
- 인터페이스에 선언된 필드는 모두 public static final의 틀성을 가지므로 생략해도 자동적으로 컴파일 과정에서 붙음.
- 상수명은 대문자로 작성, 서로 다른 단어는 언더바(_)로 연결
- 선언과 동시에 초기값 지정
[public static final] 타입 상수이름 = 값;
추상 메소드 선언
- 인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행.
- 인터페이스의 메소드는 실행블록이 필요 없는 추상 메소드로만 선언.
- public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 됨.
[public][abstract] 리턴유형 메서드(매개변수리스트);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package chap08;
public interface RemoteControl {
//[public][static final] 타입 상수필드=초기값;
int MIN_VOLUME = 0; //생략해도 괜찮음.
public static final int MAX_VOLUME = 10;
//생성자x
//추상메서드(메소드 선언부만 작성)
//[public][abstract] 리턴유형 메서드(매개변수리스트);
void turnOn();
void turnOff();
public abstract void setVolumn(int volumn);
}
|
cs |
인터페이스 구현
- 인터페이스의 추상 메소드에 대한 실체 메소드를 가진 객체 : 구현 객체
- 구현 객체를 생성하는 클래스 : 구현 클래스
구현클래스
public class 구현클래스이름 implements 인터페이스이름{
//인터페이스에 선언된 추상메소드의 실체 메소드 선언
}
인터페이스 RemoteControl의 구현클래스>
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
|
package chap08;
public class TV implements RemoteControl {
private int volumn;
@Override
public void turnOn() {
System.out.println("TV를 turnOn()");
}
@Override
public void turnOff() {
System.out.println("TV를 turnOff()");
}
@Override
public void setVolumn(int volumn) {
if(volumn>RemoteControl.MAX_VOLUME) {
this.volumn=RemoteControl.MAX_VOLUME;
}else if(volumn<RemoteControl.MIN_VOLUME) {
this.volumn=RemoteControl.MIN_VOLUME;
}else {
this.volumn = volumn;
}
System.out.println("현재 TV볼퓸:"+this.volumn);
}
}
|
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
|
package chap08;
public class Audio implements RemoteControl {
private int volumn;
@Override
public void turnOn() {
System.out.println("Audio를 turnOn()");
}
@Override
public void turnOff() {
System.out.println("Audio를 turnOff()");
}
@Override
public void setVolumn(int volumn) {
if(volumn>RemoteControl.MAX_VOLUME) {
this.volumn=RemoteControl.MAX_VOLUME;
}else if(volumn<RemoteControl.MIN_VOLUME) {
this.volumn=RemoteControl.MIN_VOLUME;
}else {
this.volumn = volumn;
}
System.out.println("현재 Audio볼퓸:"+this.volumn);
}
}
|
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
|
package chap08;
public class RemoteControl_2 {
public static void main(String[] args) {
RemoteControl rc;
rc = new SmartTV();
rc.turnOn();
rc.setVolumn(15);
rc.setVolumn(-5);
rc.setVolumn(5);
Searchable s = new SmartTV();
s.search("htt;//www.n.com");
rc.turnOff();
System.out.println("-------------");
rc = new TV_p374();
rc.turnOn();
rc.setVolumn(15);
rc.setVolumn(-5);
rc.setVolumn(5);
rc.turnOff();
System.out.println("-------------");
rc = new Audio();
rc.turnOn();
rc.setVolumn(12);
rc.setVolumn(-2);
rc.setVolumn(2);
rc.turnOff();
System.out.println("-------------");
}
}
|
cs |
다중 인터페이스 구현 클래스
public class 구현클래스이름 implements 인터페이스 A, 인터페이스B{
//인터페이스 A에 선언된 추상 메소드의 실체 메소드 선언
//인터페이스 B에 선언된 추상 메소드의 실체 메소드 선언
}
Searchable 인터페이스>
1
2
3
4
5
6
|
package chap08;
public interface Searchable {
void search(String url);
}
|
cs |
-> 추상메서드는 body{} 구현부가 없다.
인터페이스 RemoteControl,Searchable의 구현클래스>
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
|
package chap08;
public class SmartTV implements RemoteControl,Searchable {
private int volumn;
@Override
public void turnOn() {
System.out.println("SmartTV를 turnOn()");
}
@Override
public void turnOff() {
System.out.println("SmartTV를 turnOff()");
}
@Override
public void setVolumn(int volumn) {
if(volumn>RemoteControl.MAX_VOLUME) {
this.volumn=RemoteControl.MAX_VOLUME;
}else if(volumn<RemoteControl.MIN_VOLUME) {
this.volumn=RemoteControl.MIN_VOLUME;
}else {
this.volumn = volumn;
}
System.out.println("현재 SmartTV볼퓸:"+this.volumn);
}
@Override
public void search(String url) {
System.out.println(url+"검색");
}
}
|
cs |
인터페이스 사용
인터페이스(RemoteControl)는 개발 코드(MyClass)와 구현 객체(Television, Audio)사이에서 접점 역할을 담당.
개발 코드는 인터페이스에 선언된 추상 메소드(turnOn())를 호출하고
인터페이스는 구현 객체의 재정의 메소드(turnOn())를 호출.
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 chap08;
public class Myclass {
//필드
RemoteControl rc = new TV_p374();
//생성자
Myclass_p382(){}
//생성자의 매개변수에 사용된 인터페이스 사용
Myclass(RemoteControl rc){
this.rc = rc;
rc.turnOn();
rc.setVolumn(9);
}
//메서드의 매개변수에 사용된 인터페이스 사용
void test1(RemoteControl rc) {
rc.turnOn();
rc.setVolumn(8);
}
//메서드의 지역변수에 사용된 인터페이스 사용
void test2() {
RemoteControl rc = new TV();
rc.turnOn();
rc.setVolumn(10);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package chap08;
public class MyclassMain {
public static void main(String[] args) {
//클래스의 생성자의 매개변수에 사용된 인터페이스 사용
Myclass_p382 mc2 = new Myclass_p382(new Audio_p375());
System.out.println("-----------------");
//생성자의 매개변수에 사용된 인터페이스 사용
Myclass_p382 mc1 = new Myclass_p382();
System.out.println("-----------------");
//메서드의 매개변수에 선언된 인터페이스 사용
Myclass_p382 mc3 = new Myclass_p382();
mc3.test1(new Audio_p375());
System.out.println("-----------------");
//메서드의 매개변수에 선언된 인터페이스 사용
mc3.test2();
}
}
|
cs |
* 실행 결과
SmartTV를 turnOn()
현재 SmartTV볼퓸:10
현재 SmartTV볼퓸:0
현재 SmartTV볼퓸:5
htt;//www.n.com검색
SmartTV를 turnOff()
-------------
TV를 turnOn()
현재 TV볼퓸:10
현재 TV볼퓸:0
현재 TV볼퓸:5
TV를 turnOff()
-------------
Audio를 turnOn()
현재 Audio볼퓸:10
현재 Audio볼퓸:0
현재 Audio볼퓸:2
Audio를 turnOff()
-------------
'개발 수업 > JAVA' 카테고리의 다른 글
[Java] Object 클래스(equals(),hashCode()) (0) | 2023.05.22 |
---|---|
[Java] 컬렉션 프레임워크/List 컬렉션(Vector,ArrayList,LinkedList),Set컬렉션(HashSet) (0) | 2023.05.22 |
[Java] 인터페이스 예제 (0) | 2023.05.18 |
[Java] 다형성/필드의 다형성,매개 변수의 다형성 (0) | 2023.05.18 |
[Java] 상속/타입변환(강제 타입 변환(casting),객체 타입 확인(instanceof)) (0) | 2023.05.18 |