추상클래스와 비스무리하게 생긴놈이 하나 있는데 이게 인터페이스 입니다.

인터페이스가 어떻게 사용되느냐아~

어떠한 객체가 특정 인터페이스를 사용하려 한다면 그 객체는 반드시 인터페이스에 명시되어있는 메소드를 구현해야 합니다.

만약 그렇지 않았다면 컴파일이 되지 않습니다. 에러에러!!


생김새를 봅시다

먼저 인터페이스를 만들떄에는 13번라인과 같이 interface라는 키워드를 사용합니다.

그리고 3번라인을 보시면 implements 키워드를 써주고 그다음 인터페이스 이름을 적어줍니다.

그리고 저는 이것을 '클래스InterfaceDemo는 인터페이스calc를 구현한다.' 라고 말합니다.

언뜻 보면 상속과 비슷하지만 상속과는 다릅니다.

상속은 자식클래스가 부모클래스의 기능을 물려받는거지만 인터페이스는 인터페이스에 정의된 메소드가 반드시 존재하도록 강요합니다. 5번라인부터 8번라인을 지워보시면 에러가 발생하는 것을 확인 하실 수 있습니다.

또한, 주석을 보시다 제어자들은 생략이 가능합니다.


하나의 클래스는 여러개의 인터페이스를 구현 할 수 있습니다.

바로 밑의 소스처럼요~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.dreamstorage.Inferface.example;
 
public class InterfaceDemo implements calc, demo{
 
    @Override
    public void add() {
        
    }
 
}
 
interface calc{
    public static final int a = 1;    // public static final 생략가능
    public abstract void add();        // public abstract 생략가능
}
 
interface demo{
    
}
cs


인터페이스demo를 만들었구요 클래스InterfaceDemo에서 보다시피 인터페이스calc와 demo를 상속받았네요.


그리고 인터페이스는 상속도 됩니다~

단, 인터페이스의 상속은 인터페이스로부터만 상속을 받을 수 있습니다. 그리고 다중상속도 가능합니다!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.dreamstorage.Inferface.example;
 
interface Interface_1{
    public void a();
}
 
interface Interface_2 extends Interface_1{
    public void b();
}
 
public class InterfaceDemo implements Interface_2{
 
    @Override
    public void a() {
    
    }
 
    @Override
    public void b() {
        
    }
}
cs

Interface_2가 Interface_1을 상속받고 있습니다.
그리고 클래스InterfaceDemo는 Interface_2를 구현하고있네요

제가 앞서 말했듯이 인터페이스를 사용하기 위해선 그 인터페이스에 명시되어 있는 메소드를 반드시 구현해야 한다고 하였습니다.

Interface_2는 Interface_1를 상속받고 있으므로 Interface_1의 b()역시 구현해주어야 합니다. 그렇지 않으면 에러!!



마지막으로 인터페이스를 알았으니 인터페이스를 이용한 두 정수의 합을 구하는 간단한 계산기를 만들어보겠습니다.

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 com.dreamstorage.Inferface.example;
 
public class InterfaceDemo{
    public static void main(String[] args) {
        Calculator c = new Calculator();
        c.setOp(3223);
        System.out.println("두 수의 합 : " + c.sum());
    }
}
class Calculator implements calc{
    private int num1, num2;
    
    @Override
    public void setOp(int num1, int num2){
        this.num1 = num1;
        this.num2 = num2;
    }
    
    @Override
    public int sum(){
        return this.num1 + this.num2;
    }
}
 
interface calc{
    public void setOp(int num1, int num2);
    public int sum();
}
cs


정리!

인터페이스를 구현하기 위해서는 implements 키워드르 사용한다.

인터페이스는 상수와 추상메소드로 구성되어있다!

인터페이스는 상속이 가능하다!! (인터페이스로부터만 상속가능!) 또한 다중상속이 가능하다!

인터페이스의 멤버는 반드시 public이어야 한다!

- 처음 이미지로된 소스를 보시다시피, 인터페이스의 멤버는 public입니다.


abstract와 interface의 차이점.

이렇게 적어서 정리하다 보니 abstract와 interface는 참 비슷합니다. 

interface는 구체적인 구현부를 가질수 없고, abstract는 구체적인 로직의 구현부를 가질 수있다는 것이 둘의 큰 차이점이 아닐까 싶습니다.