ABOUT ME

95.12.1 / 취준생 / Java

Today
Yesterday
Total
  • CHAPTER 7. (6) 다형성이란? (참조변수 형변환, 매개변수 다형성, instanceof연산자 포함) ★★
    java/ㄴ CHAPTER 7. 객체지향 프로그래밍 2 2020. 4. 2. 11:14


     - 여러 가지 형태를 가질 수 있는 능력
     1. 부모 (클래스) 타입의 참조변수로 자식 (클래스) 타입 인스턴스를 참조 가능
     2. 실행하는 메서드는 동일하지만, 부모 타입의 참조 변수에 따라 실제로 조립된 객체의 재정의(오버라이딩)된 내용 실행
      : ★ 실행하는 메서드 동일, 실제 조립된 객체에 따라 다른 실행결과 발현됨

     - 필수적으로 재정의 필요
     - 재정의 관계일 때 가장 바깥의 것이 실행됨

    즉, 지금까지는 인스턴스 타입과 일치하는 타입의 참조변수만 사용

    ex.
    Tv t = new Tv();
    CaptionTv c = new CaptionTv();

    but 서로 상속 관계일 경우, 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스 참조 가능

    ex.
    Tv t = new CaptionTv();

    실제 인스턴스가 CaptionTv 타입이라도 참조변수 t로는 CaptionTv의 모든 멤버 사용 불가 (t.text, t.caption() 사용 불가)
     => 같은 타입의 인스턴스라도 참조변수 타입에 따라 사용할 수 있는 멤버 개수가 다름

    ex.
    /*

    Iphone 객체 생성 후 해당 객체의 모든 멤버 사용
    Iphone p1 = new Iphone();
    Galaxy p2 = new Galaxy();

    인터넷 기능이 지원되는 SmartPhone류 객체 생성, SmartPhone 타입 변수에 저장
    SmartPhone 류들이 지원하는 멤버 사용

    SmartPhone p1 = new SmartPhone(); p1.internet();
    p1 = new Iphone(); p1.internet();
    p1 = new Galaxy(); p1.internet();

    사진 촬영이 지원되는 폰류를 객체 생성해서 사진촬영 해보고, 성능 테스트
    FeaturePhone p1 = new FeaturePhone(); p1.photo();

    p1 = new SmartPhone(); p1.photo();
    p1 = new Iphone(); p1.photo();
    p1 = new Galaxy(); p1.photo();

    // 애플뮤직기능 사용, Iphone류 객체 생성 Iphone, Iphone8, IphoneX, Iphone11
    // 지문인식기능 사용, Iphone8류 객체 생성 Iphone8
    // 얼굴인식기능 사용, IphoneX류 객체 생성 IphoneX, Iphone11

    */




    참조변수의 형변환
     - 기본형 변수처럼 형변환 가능 (단, 서로 상속관계인 클래스 사이에서만 가능)
     = 자식(부모) 타입의 참조변수를 부모(자식) 타입 참조변수로 형변환이 가능하다

    ex.

    FireEngine f = new FireEngine();

    Car c = (FireEngine) f;  // 괄호 생략 가능

    FireEngine f2 = (FireEngine) c; // 괄호 생략 불가


    참조변수 형변환은 그저 리모컨(참조변수)를 다른 종류로 바꾸는 것
     이유? 사용 할 수 있는 멤버 개수를 조절하기 위해서



    instanceof 연산자
     - 주로 조건문에서 사용
     - 왼쪽에는 참조변수, 오른쪽에는 타입
     - 반환값은 true / false
     => 참조변수가 타입으로 형변환이 가능한가?


    /* 
    instanceof 연산자 
    참조변수가 참조하는 객체의 실제 타입을 확인하는 연산자 
    사용법 : 참조변수 instanceof 연산자 
    연산결과 
    true : 검사에 사용했던 타입으로 형변환이 가능함 
    false : 검사에 사용했던 타입으로 형변환 불가능 

    Iphone p = new Iphone(); 

    // p가 참조하는 객체가 Iphone 타입 객체인가? 
    p instanceof Iphone --------> true 

    p instanceof Galaxy --------> false 
    p instanceof SmartPhone ----> true 
    p instanceof Phone ---------> true 

    Iphone p = new Iphone8(); 

    p instanceof Iphone8 -------> true 
    p instanceof IphoneX -------> false 
    p instanceof Iphone11 ------> false  
    p instanceof Galaxy --------> false  
    p instanceof Iphone --------> true  
    p instanceof SmartPhone ----> true 
    */ 




    매개변수의 다형성

    void buy (Tv t) 로는 Tv밖에 살 수 없음

    Computer 살대는 또 void buy (Computer c) 만들고 ....

    제품 수 늘어날 때마다 새로운 buy메서드 추가 필요 (매우 번거로움)

    void buy(Product p) 로 다형성 적용

    매개변수가 Product 타입 참조변수
     => Product 클래스의 자식 타입 참조변수면 어느 것이나 매개변수로 받을 수 있다

     

     

     

    조상타입 참조변수 배열 사용 시, 공통의 조상을 가진 서로 다른 종류 객체를 배열로 묶어서 다룰 수 있음

Designed by Tistory.