티스토리 뷰

Java의 인터페이스

100%추상 클래스

- 모든 메소드가 추상 메소드(public abstract)

- 데이터는 클래스 상수만 가능(publicstaticfinal)

- default메소드와 static메소드는 몸체의 구현이 필요함


객체 생성 불가


클래스와 마찬가지로 참조 자료형


인터페이스의 이름은 보통 형용사임

- Runnable,Serializable,Comparable



인터페이스 정의

문법은 클래스 정의와 유사함


정의할 때 키워드 class대신에 interface를 사용

- abstract는 생략하는 것이 보통임


메소드는 자동으로(생략 가능) public abstract임

- 수행할 수 있는 기능의 형식만 나열한 것


default 메소드와 static메소드도 가능

- 이 경우 몸체를 구현해야 함

- 자동으로 public임


필드는 자동으로 public static final임

- 클래스 상수만 가능함



인터페이스의 사용

추상 클래스와 마찬가지로 자식 클래스에 상속되어 사용됨

- 인터페이스를 상속받는 자식 클래스는 모든 추상 메소드를 구현해 주어야 함


의미적으로는 관련이 없으나 기능적으로 유사한 클래스들을 묶을 때 사용할 수 있음

- 예 : 대소 비교가 가능한 객체들의 자료형을 묶을 때


인터페이스를 상속받아 자식 인터페이스를 정의할 수 있음

- 인터페이스의 확장



인터페이스의 상속과 구현

여러 인터페이스를 상속받는 다중 상속이 가능

클래스는 단일 상속만 가능


상속

- 자식 인터페이스가 부모 인터페이스를 상속받는 경우

- extends를 사용


1
 interface A extends OtherInterface1 {…}
cs


구현(or 상속)

- 자식 클래스가 부모 인터페이스를 상속받는 경우

- 자식은 부모가 나열한 기능을 구현해야 함

- implements를 사용


1
class MovablePoint implements Movable {…}
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
36
37
38
39
40
41
42
43
44
45
46
interface Movable {
    void moveUp();
    void moveDown();
    void moveLeft();
    void moveRight();
}
 
public class MovableTest {
    public static void main(String[] args){
        Movablem1 = new MovablePoint(55);
 
        System.out.println(m1);
        m1.moveUp();
        System.out.println(m1);
        m1.moveRight();
        System.out.println(m1);
    }
}
 
class MovablePoint implements Movable {
    private int x,y;
 
    public MovablePoint(int x, int y) {
        this.x = x;
        this.y = y;
}
 
public String toString() {
    return "Point at(" + x + ", " + y + ")";
}
 
public void moveUp(){
    y++;
}
 
public void moveDown(){
    y--;
}
 
public void moveLeft(){
    x--;
}
 
public void moveRight(){
    x++;
}
cs



Point at (5, 5)

Point at (5, 6)

Point at (6, 6)



디폴트 메소드

인터페이스에서 선언하는 메소드에 기본 구현을 넣을 수 있음

- 자식 클래스에서 그대로 사용하거나 몸체를 다시 정의해 줄 수 있음


default를 사용하고 몸체를 구현해 줌


인터페이스에 나열된 기능을 확장할 때,기존 코드의 수정을 피하기 위함

- 추상 메소드가 추가된다면 기존 인터페이스를 구현한 클래스를 수정해야 함


1
2
3
4
5
6
7
8
9
interface DoIt {
    void doSomething();
    int doSomethingElse(Strings);
 
    // 아래를 새로 추가한다면?
    default boolean didItWork(int i, String s) {
        ……
    }
}
cs



추상 클래스/인터페이스/클래스의 형 변환

인터페이스와 클래스는 모두 사용자 정의형

extends와 implements에 따라 상위/하위 자료형 관계가 설정 

상위 유형의 변수는 하위 객체의 참조값을 가질 수 있음

상위 유형의 변수가 가리키는 객체의 실제 유형에 따라 수행되는 메소드가 결정됨(동적 바인딩)
- 변수의 선언 유형으로 정하지 않음

1
2
SuperClass super = new SubClass();
super.method(); // SubClass에서 찾음
cs


공지사항
최근에 올라온 글
Total
Today
Yesterday