Day 13 :) 다형성

Nux·2021년 9월 16일
0

자바웹개발

목록 보기
13/105
post-thumbnail

다형성

  • 여러가지 형태를 가질 수 있는 능력
  • 부모클래스의 참조변수로 자식클래스의 인스턴스를 가질 수 있게 하는 것
  • 자바에서 다형성은 형변환, 오버로딩(중복정의), 오버라이딩(재정의)등이 있음

형변환

  • 상속관계, 구현관계에 있는 상위객체와 하위객체 사이에서 발생

Upcasting


부모클래스 변수명 = new 자식클래스();

  • 부모 클래스의 변수가 자식 클래스로 객체화된 인스턴스를 가르키는 것
  • 자식클래스의 객체가 부모클래스의 객체로 형변환 됨
  • 업캐스팅 된 객체는 자식 객체만 가지고 있는 멤버에는 접근이 불가능
  • 자동 형변환, 묵시적 형변환 발생
ex)
	   [Phone]
          /	  \	
[FeaturePhone]	[SmartPhone]
	 	/	  \
          [Android]	  [Apple]
           /	    	      \	
    [galaxy]  	    	    [Iphone]    
1. Phone p1 = new Phone();
2. SmartPhone p2 = new SmartPhone();
3. [부모]Phone p3 = new [자식]SmartPhone();
4. [부모]Phone p4 = new [자식]FeaturePhone();
5. SmartPhone p5 = new FeaturePhone();	// 상속관계가 아니므로 불가
1.
class Tv{
	boolean power;
    int channel;
    
class SmartTv extends Tv{
	String text;
    void caption(){}
    }    
ex1) SmartTv s = new SmartTv();
SmartTv는 Tv를 상속하였으므로
자신이 갖고 있는
text, caption
뿐만 아니라 Tv의
power, channel 까지 참조

ex2) Tv t = new SmartTv();
SmartPhone 객체 생성 후, Tv의 인스턴스인
t는 SmartTv 객체를 가르키지만, Tv타입이기 때문에
Tv클래스 멤버인
power, channel
에만 접근 가능
  • Object타입의 참조변수는 배열을 포함한 모든 객체 참조 가능
Object o1 = new Iphone();
Object o2 = new FeaturePhone();

downcasting


자식클래스 변수명 = (자식클래스) 부모클래스인스턴스;

  • 업캐스팅 되어 접근 할 수 없게 된 자식 클래스의 객체를 다시 복구시키는 것
  • 강제형변환, 명시적 형변환 발생
class Car{
	void start(){}
    void stop(){}
    void drive(){}
    }

class SUV{
	void driveOffRoad(){}
    }
1. Car car = new SUV();
/* 업캐스팅
* SUV객체 안에서 start, stop, drive 메서드 참조 가능
*/ SUV 고유의 메서드인 driveOffRoad 참조 불가

2. SUV suv = (SUV)car;
suv.driveOffRoad();
혹은
((SUV)suv).driveOffRoad();
/* 다운캐스팅
* 자식클래스인 SUV객체 내에서 부모클래스인 Car의 메서드만 참조 할 수 있었던
* 변수 suv를 잠시 SUV의 메서드도 참조 할 수 있게 함
* 변수 suv의 주소값은 그대로이므로 Car의 메서드 접근에는 아무 제한 없음
*/ 단, 한번 업캐스팅을 하면 다운캐스팅 할 때마다 묵시적 형변환이 필요함

instanceof 연산자

객체 instanceof 클래스

  • 자식 instanceof 부모 // true값 반환
  • 검사한 클래스로의 형변환이 가능한지 확인 가능
  • 결과값은 boolean값으로 반환됨.
class A{}
class B extends A{}
class example{
    A a = new A();
    B b = new B();
    System.out.println(a instanceof A);	// true. A는 a타입으로 형변환 가능
    System.out.println(a instanceof B);	// false. B는 a타입으로 형변환 불가
    System.out.println(b instanceof A);	// true. A는 b타입으로 형변환 가능
    System.out.println(b instanceof B);	// true. B는 b타입으로 형변환 가능
    }
    
  • if문과 짝지어질 때 많음
if( b instance of A ){
	// 참일 경우 실행 될 수행문
	System.out.println("A는 b로 형변환이 가능하다");
}

0개의 댓글