▶ 인터페이스(Interface)
- 추상 메소드들로만 이루어진 형태로, 객체의 사용 방법을 정의한 새로운 타입이다.
- 상수 외에 필드를 선언할 수 없다.
- 자바에서 인터페이스란 객체와 객체 사이의 상호 작용이 이루어지는 인터페이스이다.
- 추상 메소드의 성질을 이용하면, 인터페이스는 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다.
- 즉, 개발 코드를 수정하지 않고 사용하는 객체만 변경하여 메소드를 실행한다.
- 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.
- 상속은 같은 종류의 하위 클래스를 만드는 기술이고, 인터페이스는 사용 방법이 동일한 클래스를 만든다는 점에서 개념적인 차이가 있다. 그러나 둘 다 다형성을 구현하는 기술이다.
- 인터페이스를 구현하는 객체를 “구현 객체”라고 부르며, 구현 객체를 생성하는 클래스를 “구현 클래스”라고 부른다. 구현 클래스는 추상 메소드의 몸체를 반드시 구현하여야 한다.
- 인터페이스의 모든 메소드는 기본적으로 public 접근 제한자를 갖기 때문에 구현 클래스에서 작성할 때 public 보다 더 강한 접근 제한자(default, private 등)를 사용할 수 없다. 즉, public을 생략해선 안된다.
- 상속과는 달리 구현 클래스는 다수의 인터페이스를 구현할 수 있다.
- 인터페이스끼리는 상속이 가능하다.
public interface 인터페이스1 extends 인터페이스2 { ... }
- 구현 클래스는 선언부에 implements 키워드를 추가하고 인터페이스 명을 명시해야 한다.
* implements 는 ‘시행하다, 도구’ 라는 뜻이다.
- 인터페이스 타입의 변수는 참조형 변수이기 때문에 구현 객체가 대입될 경우 구현 객체의 번지를 저장한다.
▶ 인터페이스의 구성 멤버
- 상수 필드 : 상수는 인터페이스에 고정된 값이므로 런타임 시에 데이터를 바꿀 수 없다. 상수를 선언할 때에는 반드시 초기값을 대입해야 한다.
public static final 자료형 변수명;
- 추상 메소드 : 객체가 사용할 메소드의 형태를 설명한 것으로, 어ᄄᅠᆫ 매개값이 필요하고 리턴 타입이 무엇인지만 알려준다. 실체 실행부는 해당 인터페이스를 구현하는 클래스에서 작성해야 한다.
- 디폴트 메소드 : 자바 8버전에서만 허용하는 멤버이며, 기존 인터페이스를 확장해서 사용하기 위함이다. 선언할 때 인터페이스를 구현한 실제 객체가 가지고 있는 메소드라고 생각하면 된다. 따라서 구현 객체에서는 인터페이스의 디폴트 메소드의 실체 메소드를 작성할 필요가 없다.
- 정적 메소드 : 자바 8버전에서만 허용하는 멤버이며, 디폴트 메소드와 달리 객체가 없어도 인터페이스만으로 호출이 가능하다. 쉽게 말해, 인터페이스를 선언하지 않고 "인터페이스이름.정적메소드명()"과 같이 바로 호출이 가능함.
▶ 인터페이스의 일반적인 형태
- 인터페이스의 모든 메소드는 추상 메소드로 간주되므로 abstract키워드는 사용하지 않는다.
public interface 인터페이스명 {
//상수
...
//추상 메소드
리턴타입 추상메소드1(...);
리턴타입 추상메소드2(...);
...
//디폴트 메소드 -> default를 붙여야한다. 안 붙이면 추상 메소드로 간주됨
default 리턴타입 메소드명(...) { ... }
...
//정적 메소드
static 리턴타입 메소드명(...) { ... }
}
public class 클래스명 implements 인터페이스명 {
//FIELDS
...
//CONSTRUCTOR
...
//METHODS
@Override
리턴타입 추상메소드1(...) {
...
}
@Override
리턴타입 추상메소드2(...) {
...
}
}
- @Override 란 인터페이스의 추상 메소드에 대한 정확한 실체 메소드인지 컴파일러가 체크하도록 지시하는 어노테이션이다. 생략해도 상관없으나, 실체 메소드가 잘못되지 않도록 해주기 때문에 붙여 주는 것이 좋다.
▶ 인터페이스의 타입 변환
- 구현 객체가 인터페이스 타입으로 변환되는 것은 자동 타입 변환에 해당한다. 이렇게 자동 타입 변환된 구현 객체는 해당 클래스의 필드와 메소드를 사용할 수 없다. 즉, 인터페이스의 상수와 메소드만 사용가능하다.
- 반대로, 인터페이스 타입인 구현 객체를 강제 타입 변환하여 구현 클래스 타입으로 사용할 수 있다.
- 필드와 매개변수의 타입을 인터페이스로 선언하면 여러 구현 객체를 대입하여 다양한 실행 결과를 만들 수 있다.
'Programming Language > JAVA' 카테고리의 다른 글
14. Inner Class (Nested Class) and Interface - 중첩 클래스와 중첩 인터페이스 (0) | 2017.05.03 |
---|---|
13. Anonymous Class - 무명 클래스와 익명 구현 객체 (0) | 2017.04.16 |
11. Array - 배열 (0) | 2017.04.16 |
10. Abstract Class - 추상 클래스 (0) | 2017.04.08 |
9. Extend - 상속 (0) | 2017.04.08 |