포스트

[JAVA] 인터페이스

인터페이스(interface)

인터페이스란

  • 추상메소드의 집합
  • 구현된 것이 없는 껍데기 설계도
  • 개발 코드 수정을 줄이면서 유지보수성을 향상시키기 위해 인터페이스를 사용한다.

인터페이스 구현 방식

1
2
3
4
interface 인터페이스이름 {
	public static final 타입 상수이름 = ; // 상수
	public abstract 메소드이름(매개변수); // 추상메소드
}
  • 모든 interface 멤버는 public이며, 메소드 모두 추상 메소드여야한다.
  • 상수는 항상 public, static, final이기 때문에, 생략 가능하다.
  • 메소드는 항상 public, abstract이기 때문에, 생략 가능하다.
  • 인터페이스의 부모로는 인터페이스만 가능하다. (Object가 부모가 아님)
  • 다중 상속 가능(추상메소드는 충돌해도 문제 없음)
1
2
interface 인터페이스이름 extends 인터페이스1, 인터페이스2 {
}

인터페이스 구현

  • 인터페이스에 정의된 추상 메소드를 완성해야 구현이 가능하다.
  • 해당 클래스에 implements 키워드를 사용하여 인터페이스를 나열하며 구현할 수 있다.
    1
    2
    3
    
    class 클래스이름 implements 인터페이스이름 {
      // 해당 인터페이스에 정의된 추상메소드들을 모두 구현해야됨
    }
    

implements - 구현하다

  • interface의 추상메소드 중 일부만 구현하였을 경우, 클래스 앞에 abstract를 붙여야한다.
1
2
3
4
5
6
7
8
9
10
interface Fightable {
	void move(int x, int y);
	void attack(Unit u);
}

// 일부만 구현
abstract class Marine implements Fightable {
	public void move(int x, int y) {
	};
}

인터페이스와 추상클래스의 차이

설명을 보면 인터페이스와 추상클래스가 비슷한 역할을 하는 것 같다. 그럼 둘의 차이점은 무엇일까?

  1. 인터페이스는 인스턴스변수를 가질 수 없다.
  2. 인터페이스는 인스턴스 메소드와 생성자를 사용할 수 없다.
  3. 인터페이스는 추상메소드만 가지고 있다.

인터페이스 다형성

  • 인터페이스에 다형성을 그대로 적용이 가능하다.
  • 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능하다.
  • 인터페이스를 메소드의 반환타입으로도 지정이 가능하다.
  • 메소드의 반환타입이 인터페이스라면 인터페이스를 구현한 객체를 반환해야한다.
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
// 추상 클래스
abstract class Unit {  
    int x, y;  
  
    abstract void move(int x, int y);  
  
    void stop() {  
        System.out.println("stop");  
    }  
}  

// 인터페이스
interface Fightable {  
    void move(int x, int y);  
  
    void attack(Fightable f);  
}  
 
// 추상클래스와 인터페이스가 상속된 클래스 
class Fighter extends Unit implements Fightable {  
    public void move(int x, int y) {  
        System.out.println("[" + x + "," + y + "]로 이동");  
    }  
  
    public void attack(Fightable f) {  
        System.out.println(f + "를 공격");  
    }  
  
    // Fightable을 반환하는 메소드
    Fightable getFightable() {  
        Fightable f = new Fighter();  
        return f;  
    }  
}  
  
public class MyPoint {  
    public static void main(String[] args) {  
        Unit u = new Fighter();  
        u.move(10, 10);  
//      u.attack(new Fighter()); // Unit에 attack이 없기 때문에 호출 불가  
  u.stop();  
  
        Fightable f = new Fighter();  
        f.move(10, 10);  
        f.attack(new Fighter());  
//      f.stop(); // Fightable에는 stop이 없기 때문에 호출 불가  
  
		Fighter f2 = new Fighter();  
        Fightable getFitable = f2.getFightable(); // 형변환  
		System.out.println(getFitable);  
    }  
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.