인터페이스는 추상과 비슷한 개념이지만 오직 설계만을 위한 구조라는 점에서 클래스라고 하지 않고 인터페이스라고 부릅니다. 추상 클래스 또는 인터페이스가 되는 것이죠.
사용법은 간단합니다. 앞에 클래스 대신 인터페이스로 정의해주고 설계도를 작성한 후, 다른 클래스에서 상속받는 것입니다. 쓰는 용어가 다를 뿐 추상 클래스와 거의 동일한 형태입니다. 다만 아래와 같은 차이점이 있습니다.
[ 추상 클래스]
- 다중 상속 불가
- 일반 메소드(정의 된 메소드)와 추상 메소드 혼용 가능
- 변수는 상속되어 값을 변경할 수 있음
[ 인터페이스 ]
- 다중 상속 가능
- 정의 되지 않은 추상 메소드만 사용 가능
- 초기화된 변수만 사용 가능하며 상속된 변수는 상수로 취급 (값을 변경할 수 없음)
즉, 추상 클래스는 내용과 껍데기가 동시에 존재할 수 있다면 인터페이스는 상수와 껍데기만 존재할 수 있다는 점에서 보다 설계도의 역할에 충실합니다. 초기화된 변수는 굳이 final을 붙이지 않아도 상수처럼 취급되어 변경이 불가합니다.
※ 수정사항
Java8부터는 인터페이스에서도 정의된 메소드를 사용할 수 있도록 변경되었습니다. static, default, private 메소드는 정의해서 추상 클래스와 같이 사용 가능합니다. private 메소드는 상속이 불가능하므로 static 메소드나 default 메소드 안에 넣어서 사용하면 됩니다.
아래와 같이 사용 가능합니다. 다중 상속됐을 때 같은 이름의 메소드가 있다면 하나만 정의해주면 됩니다. 또한 초기화된 변수(상수)의 경우 같은 이름이 있다면 소속을 명확하게 써줘야 합니다. 예를 들어 변수(필드) a가 두 개 있다면 Calc1.a, Calc2.a 와 같이 표기해야 합니다. 또한 인터페이스에서는 굳이 메소드에 abstract를 붙여줄 필요가 없습니다. 어차피 모두 abstract 메소드라는 가정하에 작성되기 때문입니다.
[ CalcM.java (다중상속 된 클래스) ]
package study.first;
public class CalcM implements Calc1, Calc2 {
@Override
public void test() {
System.out.println(a + b + x + y);
}
@Override
public void printCalc1() {
System.out.println(x + y);
}
@Override
public void printCalc2() {
System.out.println(a + b);
}
}
[ Calc1.java - 인터페이스 ]
package study.first;
public interface Calc1{
int x = 1;
int y = 2;
void test();
void printCalc1();
}
[ Calc2.java - 인터페이스 ]
package study.first;
public interface Calc2{
int a = 5;
int b = 10;
void test();
void printCalc2();
}
'▸JAVA > 기본 문법' 카테고리의 다른 글
객체의 등가성(객체 비교)_관계 연산자(==) 비교 [1/4] (2) | 2019.12.10 |
---|---|
다형성의 활용 (오버라이딩) (4) | 2019.12.10 |
애노테이션(annotation) (0) | 2019.12.10 |
추상 (abstract) 클래스와 메소드 (0) | 2019.12.10 |
클래스 상속 (extends) (0) | 2019.12.10 |
댓글