티스토리 뷰
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(5, 5); 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 |
추상 클래스/인터페이스/클래스의 형 변환
1 2 | SuperClass super = new SubClass(); super.method(); // SubClass에서 찾음 | cs |