[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
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 라이센스를 따릅니다.