Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발계발

인터페이스의 타입 변환과 다형성 본문

자바

인터페이스의 타입 변환과 다형성

Ju_Nik_E 2024. 5. 2. 16:46

타입 변환

인터페이스의 타입 변환은 인터페이스와 구현 클래스 간에 발생한다.
자동 타입 변환과 강제타입 변환이 있는데, 인터페이스 변수에 구현 객체를 대입하면 구현 객체는 인터페이스 타입으로 자동 타입 변환되고, 인터페이스 타입을 구현 클래스로 타입으로 변환시킬 때는 강제 타입 변환이 필요하다.

 

자동 타입 변환

말 그대로 자동으로 타입 변환이 일어나는 것으로, 아래와 같은 조건에서 일어난다.
인터페이스 변수 = 구현객체;

위 이미처럼 인터페이스를 구현한 B, C 클래스가 있고, B와 C클래스를 각각 상속한 D, E 자식 클래스가 있을 때,

B,C,D,E로부터 생성된 객체는 모두 인터페이스 A로 자동 타입 변환이 가능하다.

B,C,D,E가 클래스가 모두 작성됐다고 가정하면 아래와 같이 자동 타입 변환이 가능하다.

public class PromotionExample {
	public static void main(String[] args) {
    	//구현 객체 생성
        B b = new B();
        C c = new C();
        D d = new D();
        E e = new E();
        
        //인터페이스 변수
        A a;
        
        //자동 타입 변환
        a = b;
        a = c;
        a = d;
        a = c;
    }
}

위 예시처럼, 구현 객체인 b,c,d,e의 타입은 모두 A로 타입변환이 가능하다.

 

강제 타입 변환

강제 타입 변환은 캐스팅 기호를 이용해 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것이다.
구현 클래스 변수 = (구현클래스) 인터페이스변수;

 

구체적인 사용예시는 아래와 같다.

public interface Vehicle {
	// 추상 메소드
    void run();
}

public class Bus implements Vehicle {
	// 추상 메소드 재정의
	@Override
    public void run() {
    	System.out.println("버스 운행 시작");
    }
    
    // 추가 메소드
    public void checkFare() {
    	System.out.println("요금 확인");
    }
}

public class CastingExample {
	public static void mian(String[] args) {
    	// 인터페이스에 구현 객체를 대입해 자동 타입 변환
    	Vehicle vehicle = new Bus();
        
        // 인터페이스의 메소드 사용
        vehicle.run();
        // vehicle.checkFare(); 자동타입변환되어 Bus클래스의 추가 메소드 사용 불가
        
        // 강제 타입변환
        Bus bus = (Bus) vehicle;
        bus.checkFare(); // 강제타입 변환을 했기 때문에 사용 가능
    }
}

다형성

사용 방법은 동일하지만 다양한 결과가 나오는 성질인 다형성은 상속에서도 사용하지만, 인터페이스를 통해 다형성을 구현하는 경우가 많다.

위 그림에서 객체B와 C중 어느 객체가 인터페이스에 대입됐냐에 따라 객체 A의 메소드 호출 결과가 달라질 수 있다.

아래의 코드예시를 보자.

public interface Tire {
	void roll();
}

public class HankookTire implements Tire {
	// 메소드 재정의
    @Override
    public void roll() {
    	// 한국 타이어
    }
}

public class KumhoTire implements Tire {
	// 메소드 재정의
    @Override
    public void roll() {
    	// 금호 타이어
    }
}

public class Car {
	//필드
    Tire tire1 = new HankookTire();
    Tire tire2 = new HankookTire();
    
    //메소드
    void run() {
    	tire1.roll();
        tire2.roll();
    }
}

public class CarExample {
	public static void main(String[] args) {
    	// 객체 생성
    	Car myCar = new Car();
        
        // run()메소드 실행
        myCar.run();
        
        // 타이어 객체 교체
        myCar.tire1 = new KumhoTire();
        
        // 다형성으로 인해 결과 변경
        myCar.run();
    }
}

 

'자바' 카테고리의 다른 글

다중 인터페이스 구현  (0) 2024.05.02
인터페이스  (0) 2024.05.02
추상 클래스와 봉인 클래스  (0) 2024.04.26
상속  (1) 2024.04.26
접근 제한자  (0) 2024.04.26