[혼공자][week5] Day16 인터페이스의 타입변환과 다형성

Ida·2025년 2월 15일
0

혼공자

목록 보기
17/20

08-2 타입 변환과 다형성

인스턴스의 다형성
프로그램 소스 코드 변함 없이 구현 객체를 교체했을 때 다양한 프로그램의 실행결과가 나오는 것.

클래스가 A, B가 있다고 가정했을 때, 인터페이스 구현 클래스를 A로 했을 때 문제가 발생하면 B 클래스와 교체한 후 프로그램 재실행 가능

1. 자동 타입 변환

구현 객체가 인터페이스 타입으로 변환되는 것.
인터페이스 구현 클래스를 상속해서 자식 클래스 만들었으면 자식 객체도 인터페이스 타입으로 자동 타입 변환할 수 있음.

2. 필드의 다형성

예제로 이해하는 필드의 다형성 (손코딩)

  • 인터페이스 선언: Tire, 추상 메소드 roll() 선언(메소드 호출 방법 설명)
  • 구현 클래스: Tire 인터페이스 구현(메소드 재정의)
  • 필드 다형성: 인터페이스 타입 필드 선언과 초기 구현 객체 대입, 인터페이스에서 설명된 roll() 메소드 호출
  • 실행 클래스: 필드 다형성 테스트. 타이어 교체 전에는 초기에 대입된 HankookTire 객체의 메소드 호출, 타이어 교체 후에는 KumhoTire 객체의 roll() 메소드 호출

즉, Car의 run() 메소드는 수정하지 않아도 다양한 roll() 메소드의 결과값을 얻음.

3. 매개 변수의 다형성

메소드 호출 시에도 자동 타입 변환 발생
매개 변수를 인터페이스 타입으로 선언하고 호출 시 구현 객체 대입.

예제로 이해하는 매개 변수의 다형성 (손코딩)

  • 매개 변수의 인터페이스화
    Driver 클래스의 drive() 메소드의 매개값을 Vehicle 인터페이스로 지정. vehicle이 구현 객체가 되고 구현 객체의 run() 메소드가 실행됨.

  • 인터페이스
    Vehicle 선언

  • 구현 클래스, 구현 메소드 재정의
    Bus, Taxi

  • 실행 클래스로 매개 변수의 다형성 테스트
    driver.drive(bus)driver.drive(taxi)에서 자동 타입 변환이 일어남.
    -> Vehicle vehicle = bus, Vehicle vehicle = taxi

4. 강제 타입 변환

구현 객체가 인터페이스 타입으로 자동 타입 변환 시 인터페이스에 선언된 메소드만 사용 가능함. 만약 구현 클래스에 선언된 필드와 메소드를 사용 시 강제 타입 변환으로 다시 구현 클래스 타입으로 변환

예제로 이해하는 강제 타입 변환 (손코딩)

  • 강제타입변환 전에는 checkFare() 메소드 호출 X
    -> Vehicle 인터페이스에 없는 메소드

  • 구현 클래스인 Bus의 checkFare() 메소드 호출을 위해 강제 타입 변환 진행

5. 객체 타입 확인

구현 객체가 인터페이스 타입인지 확인한 후 강제 타입 변환을 진행해야 함.

instanceof 연산자로 매개값이 어떤 객체인지 확인

예제로 이해하는 객체 타입 확인 (손코딩)

public void drive(Vehicle vehicle) {
	if(vehicle instanceof Bus) {
		Bus bus = (Bus) vehicle;
		bus.checkFare();
		}
  • vehicle 매개 변수가 참조하는 객체가 Bus인지 조사
  • Bus 객체일 경우 안전하게 강제 타입 변환
  • Bus 타입으로 강제 타입 변환 하는 이유: checkFare() 메소드 사용을 위함.

+ 인터페이스 상속

  • 인터페이스는 다중 상속이 허용됨.
    extend키워드 뒤에 상속할 인터페이스 나열

  • 하위 인터페이스의 구현 클래스는 하위/상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드가 있어야 함.

  • 하위 인터페이스로 타입 변환 시: 상위/하위 인터페이스에 선언된 모든 메소드 사용 가능

  • 상위 인터페이스로 타입 변환 시: 상위 인터페이스에 선언된 메소드만 사용 가능

예제 (손코딩)

  • 상위 인터페이스 선언: InterfaceA, InterfaceB
  • 하위 인터페이스 선언: InterfaceC, extends키워드 뒤에 상위 인터페이스 나열하여 상속 받음.
  • 하위 인터페이스 구현: InterfaceC에 대한 구현 클래스이지만, InterfaceA와 InterfaceB를 상속하고 있기에 상위 인터페이스의 실체 메소드도 있어야함.
  • 실행 클래스:
    InterfaceA 변수는 methodA()만 호출 가능
    InterfaceB 변수는 methodB()만 호출 가능
    InterfaceCqustnsms 모든 메소드 호출 가능
profile
나는 이다이다.

0개의 댓글

관련 채용 정보