Link
11-28 22:35
«   2020/11   »
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          
Archives
Today
1,619
Total
1,176,191
관리 메뉴

꿈 많은 사람의 이야기

자바 인터페이스 - 1 본문

java

자바 인터페이스 - 1

이수진의 블로그 이수진의 블로그 2017. 8. 16. 08:41

자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다. 인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.

이러한 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다를 수 있다. 따라서 개발 코드 측면에서는 코드 변경 없이 실행 내용과 리턴값을 다양화 할 수 있다는 장점을 가지게 된다.

인터페이스는 ~.java 형태의 소스 파일로 작성되고 컴파일러(javac.exe)를 통해 ~.class 형태로 컴파일되기 때문에 물리적 형태는 클래스와 동일하다. 단, 소스 작성 시 선언 방법이 다르다.

인터페이스 선언은 class 키워드 대신에 interface를 넣으면 된다.
interface Ri{
}
이런식으로 말이다.

인터페이스의 특징은 클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메소드만 구성 멤버로 가진다. 또한 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

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 Study_myself_1_from_350;
 
interface RemoteControlIn {
    //상수
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;
    
    //추상 메소드
    void turnOn();
    void turnOff();
    void setVolume(int volume);
    
    //디폴트 메소드
    default void setMute(boolean mute)
    {
        if(mute)
        {
            System.out.println("무음 처리합니다");
        }
        else
        {
            System.out.println("무음 해제합니다.");
        }
    }
    
    //정적 메소드
    static void chanegeBattery()
    {
        System.out.println("건전지를 교환합니다.");
    }
 
}
 
Colored by Color Scripter

인터페이스는 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드가 존재한다.

상수 필드

인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스 또는 정적 필드를 선언할 수 없다. 대신 상수 필드만 선언할 수 있는데 상수는 public static final로 선언한다. 따라서 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다. public, static, final을 생략하더라도 컴파일 과정에서 자동으로 붙는다.

추상 메소드

추상 메소드는 리턴 타입, 메소드명, 매개 변수만 기술되고 중괄호 { }를 붙이지 않는 메소드이다. 인터페이스에 선언된 추상 메소드는 모두 public abstract 특성을 갖는다. 생략 하더라도 컴파일 과정에서 붙게 된다.

디폴트 메소드

디폴트 메소드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
추상 메소드와는 다르게 실행 내용을 작성한다.

정적 메소드

정적 메소드는 static이 붙은 메소드이다. public 특성을 갖고 있어 생략하더라도 컴파일 과정에서 붙게 된다.


인터페이스를 구현하는 방법은 implements 키워드를 이용한다. 상속에선 extends를 이용했지만 인터페이스는 implements를 사용한다. 즉 구현한다라고 표현한다.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
class Television implements RemoteControlIn
{
    private int volume;
    
    public void turnOn()
    {
        //turnOn 추상메소드 실체 메소드(오버라이딩)
        System.out.println("TV를 켭니다.");
    }
    
    public void turnOff()
    {
        //turnOff 추상 메소드 오버라이딩
        System.out.println("TV를 끕니다");
    }
    
    public void setVolume(int volume)
    {
        //setVolume 메소드 오버라이딩
        if(volume > RemoteControlIn.MAX_VOLUME)
        {
            this.volume = RemoteControlIn.MAX_VOLUME;  //최대 크기가 넘지 않도록 설정
        }
        else if(volume < RemoteControlIn.MIN_VOLUME)
        {
            this.volume = RemoteControlIn.MIN_VOLUME; //최소 크기가 넘지 않도록 설정
        }
        else
        {
            this.volume = volume;
        }
        System.out.println("현재 TV 볼륨 "+volume);
    }
    
}
 
 
class Audio implements RemoteControlIn
{
    private int volume;
    
    public void turnOn()
    {
        System.out.println("Audio를 켭니다");
    }
    
    public void turnOff()
    {
        System.out.println("Audio를 끕니다");
    }
    
    public void setVolume(int volume)
    {
        if(volume > RemoteControlIn.MAX_VOLUME)
        {
            this.volume = RemoteControlIn.MAX_VOLUME;  //최대 크기가 넘지 않도록 설정
        }
        else if(volume < RemoteControlIn.MIN_VOLUME)
        {
            this.volume = RemoteControlIn.MIN_VOLUME; //최소 크기가 넘지 않도록 설정
        }
        else
        {
            this.volume = volume;
        }
        System.out.println("현재 Audio 볼륨 "+volume);
    }
}
 
public class RemoteControl
{
    public static void main(String[] args) {
        RemoteControlIn rc = new Television();
        RemoteControlIn rc2 = new Audio();
        
        rc.turnOn();
        rc.turnOff();
        
        rc2.turnOn();
        rc2.turnOff();
    }
}
 
Colored by Color Scripter

RemoteControlIn은 3개의 추상 메소드가 있기 때문에 Television과 Audio는 이추상 메소드들에 대한 추상 메소드를 가지고 있어야 한다.
만들어 주지 않으면 에러가 나오게 된다. 만약 추상 메소드에 대응하는 메소드를 작성하지 않으면 구현 클래스가 추상 클래스가 되어버린다. 그렇기 때문에 이럴경우 클래스 선언부에 sbstract키워드를 붙여야 한다.

또한, 인터페이스는  기본적으로 public 접근 제한이라서 public 보다 더 낮은 접근 제한으로 접근할 수 없다. 


인터페이스는 익명 구현으로 객체를 생성할 수 있다. 다음 소스가 익명 구체이다. 익명 구현 객체 코드는 잘 알아두어야 한다고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class RemoteControl
{
    public static void main(String[] args) {
        RemoteControlIn rc3 = new RemoteControlIn(){            
            public void turnOn(){
            
            }
            
            public void turnOff()
            {
                
            }
            
            public void setVolume(int volume)
            {
                
            }
            
        };    }
}
 
Colored by Color Scripter

이와 같이 하는 것이 익명 구현 객체 생성이다. 객체 선언하고 그 바로 안에 추상 메소드들의 실체 메소드를 작성한다.

인터페이스 내용은 다음장에 더 설명하겠다.


0 Comments
댓글쓰기 폼