자동 타입 변환
- 구현 객체가 인터페이스 타입으로 변환되는 것
- 프로그램 실행 도중에 자동적으로 타입 변환이 일어난다
- 인터페이스 구현 클래스를 상속해서 자식 클래스를 만들었다면 자식 객체 역시 인터페이스 타입으로 자동 변환 가능
필드의 다형성
- 한국 타이어와 금호 타이어는 공통적으로 타이어 인터페이스를 구현했기 때문에 모두 타이어 인터페이스에 있는 메소드를 가지고 있다.
=> 따라서 타이어 인터페이스로 동일하게 사용할 수 있는 교체 가능한 객체에 해당
매개 변수의 다형성
- 자동 타입 변환은 필드 값을 대입할 때에도 발생하지만, 주로 메소드를 호출 할 때 발생한다.
- 매개값을 다양화하기 위해서는 상속에서 매개 변수를 부모 타입으로 선언하고 호출할 때에는 자식 객체를 대입,
- 매개 변수의 타입이 인터페이스일 경우 어떠한 구현 객체도 매개값으로 사용할 수 있고 어떤 구현 객체가 제공되느냐에 따라 메소드의 실행 결과는 다양해질 수 있다.
상속은 같은 종류의 하위 클래스를 만드는 기술이고, 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술이라는 개념상의 차이는 있지만 둘 다 다형성을 구현하는 방법은 비슷하다 모두 재정의와 타입 변환 기능을 제공하기 때문입니다.
강제 타입 변환
인터페이스에 대입된 구현 객체를 다시 원래 구현 클래스 타입으로 변환하는 것
예를 들어 인터페이스에는 3개의 메소드가 선언되어 있고 클래스에는 5개의 메소드가 선언되어 있다면, 인터페이스로 호출 가능한 메소드는 3개뿐이다. 하지만 경우에 따라서 구현 클래스에 선언된 필드와 메소드를 사용해야하는 경우 강제 타입 변환을 해서 다시 구현 클래스 타입으로 변환한 다음, 구현 클래스의 필드와 메소드를 사용할 수 있다.
객체 타입 확인
- 상속에서 객체 타입을 확인하기 위해 instanceof 연산자를 사용
- instanceof 연산자는 인터페이스 타입에서도 사용 가능
- vehicle 인터페이스 타입으로 변환된 객체가 Bus인지 확인하려면 다음과 같이 작성
if(vehicle instanceof Bus) {
Bus bus = (Bus) vehicle;
}
인터페이스 타입으로 자동 타입 변환된 매개값을 메소드 내에서 다시 구현 클래스 타입으로 강제 타입 변환해야 한다면 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 해야한다.
인터페이스 상속
클래스는 다중 상속을 허용하지 않지만, 인터페이스는 다중 상속을 허용합니 다. 즉 extends 키워드 뒤에 상위 인터페이스가 올 수 있습니다.
[확인문제]
② 부모 클래스가 인터페이스를 구현하면 자식 클래스로부터 생성된 객체는 인터페이스 타입으로 자동 변환할 수 없다.(X)
나머지는 모두 O
③ 매개 변수의 타입이 클래스라면 해당 클래스로 생성된 객체만 대입이 가능하다.( X )
나머지는 모두 O
package yeong.exam03;
public interface DataAccessObject {
public void selectQ;
public void insert();
public void updateQ;
public void deleteO;
}
package yeong.exam03;
public class MySqlDao implements DataAccessObject {
@Override
public void select() {
System.out.println("MySql DB에서 검색");
}
@Override
public void insert() {
System.out.println("MySql DB에 삽입");
}
@Override
public void update() {
System.out.println("MySql DB를 수정");
}
@Override
public void delete() {
System.out.println("MySql DB에서 삭제");
}
}
package yeong.exam03;
public class OracleDao implements DataAccessObject {
@Override
public void select() {
System.out.println("Oracle DB에서 검색");
}
@Override
public void insert() {
System.out.println("Oracle DB에 삽입");
}
@0verride
public void update() {
System.out.println("Oracle DB를 수정");
}
@Override
public void delete() {
System.out.println("Oracle DB에서 삭제");
}
}
'JAVA' 카테고리의 다른 글
익명 객체 (0) | 2022.11.15 |
---|---|
중첩 클래스와 중첩 인터페이스 (0) | 2022.11.15 |
인터페이스 (0) | 2022.11.09 |
추상 클래스 (0) | 2022.10.31 |
타입 변환과 다형성 (0) | 2022.10.31 |