인터페이스(interface)
- 객체의 사용 방법을 정의한 타입
- 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있음
- 다형성 구현
- 인터페이스의 메소드를 호출하면, 객체의 메소드가 호출된다.
- 개발 코드를 수정하지 않고도 객체 교환이 가능!!
- ~.java 형태 소스 파일로 작성. 컴파일러를 통해 ~class형태로 컴파일된다.
- 클래스와 물리적 파일 형태는 갖지만, 소스 작성 내용이 다르다.
[public] interface 인터페이스 이름 { ... }
- 인터페이스는 객체로 생성할 수 없다 => 생성자를 가질 수 없다.
interface 인터페이스명 {
// 상수
타입 상수명 = 값;
// 추상 메소드
타입 메소드명(매개변수, ...);
}
상수 필드 선언(constant field)
- 데이터를 저장할 인스턴스/ 정적 필드를 선언할 수 없다.
- 상수 필드만 선언 가능.
[public static final] 타입 상수명 = 값;
- 상수 이름은 대문자로 작성. 서로 다른 단어로 구성되어 있다면 언더바(_)로 연결해준다.
public interface ExampleTest {
public int MAX_NUMBER = 10;
public int MIN_NUMBER = 0;
}
추상 메소드 선언
- 인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행
- 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언
구현 클래스 (implement class)
- 인터페이스에서 정의된 추상 메소드를 재정의해서 실행내용을 가지고 있는 클래스
- 클래스 선언부에 implements 키워드를 추가, 인터페이스 이름 명시
public class 구현클래스명 implements 인터페이스명 {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
- 객체는 다수의 인터페이스 타입으로 사용할 수 있다.
public class 구현클래스명 implements 인터페이스A, 인터페이스B {
// 인터페이스A에 선언된 추상 메소드의 실체 메소드 선언
// 인터페이스B에 선언된 추상 메소드의 실체 메소드 선언
}
인터페이스 사용
- 인터페이스는 필드, 매개변수, 로컬 변수의 타입으로 선언 가능
public class MyClass {
// 필드
RemoteControl rc = new Televesion();
// 생성자
MyClass(RemoteControl rc) {
this.rc = rc;
}
// 메소드
void methodA() {
// 로컬 변수
RemoteControl rc = new Audio();
}
void methodB(RemoteControl rc) {
...
}
}
인터페이스의 다형성
- 인터페이스 사용 방법은 같다. -> 구현 객체를 교체하여 프로그램 실행 결과를 다양화 하는 것!!!
자동타입변환(promotion)
- 구현 객체와 자식 객체는 인터페이스 타입으로 자동 타입 변환 된다.
// 자동 타입 변환
인터페이스 변수 = 구현 객체;
매개변수의 다형성
강제 타입 변환(casting)
- 구현 객체가 인터페이스 타입으로 자동 변환하면 => 인터페이스에 선언된 메소드만 사용 가능!!!!
- 구현 클래스에만 선언된 필드나 메소드를 사용할 경우, 강제타입변환.
// 강제 타입 변환
구현클래스 변수 = (구현클래스) 인터페이스변수;
객체 타입 확인 instanceof
- 구현 객체가 변환되어 있는지 알 수 없는 상태에서 강제 타입 변환-> ClassCastException 발생
- 이럴 경우, instanceof 연산자로 확인하고, 안전하게 강제 타입 변환하기
public class Driver {
public void drive(Vehicle vehicle) {
if(vehicle instanceof Bus) { // vehicle 매개 변수가 참조하는 객체가 Bus인지 조사
Bus bus = (Bus) vehicle; // Bus객체일 경우 안전하게 강제 타입변환
bus.checkFare(); // Bus 타입으로 강제타입변환을 하는 이유
}
}
}
인터페이스 상속
- 인터페이스는 다중 상속이 가능하다.
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2 {
...
}
출처 : 혼자 공부하는 자바 (신용권)
'Java' 카테고리의 다른 글
자바 #007_상속 (0) | 2023.01.16 |
---|---|
자바 : 리스트 List list = new ArrayList(); 로 사용하는 이유 (링크) (0) | 2023.01.10 |
자바 : 피라미드 * 만들어보기 (0) | 2022.12.14 |
자바 #006_클래스 (0) | 2022.12.12 |
자바 #005_참조 (0) | 2022.12.12 |
댓글