본문 바로가기
개발 수업/JAVA

[Java] 인터페이스

by 오늘 하루s 2023. 5. 20.
728x90
더보기

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()
-------------

 

728x90