[Java] OOP_다형성(Polymorphism)*, 참조변수의 형변환

jeong·2021년 6월 8일
0

Java 자바

목록 보기
24/28

다형성을 꼭 이해하고 복습하자!

다형성(Polymorphism)*

  • 하나의 참조변수로 여러 타입의 객체를 참조할 수 있다.
  • = 조상타입의 참조변수로 자손타입의 객체를 다루는 것
class Tv { //부모 
	boolean power; 
    int channel
    
    void power() { power = !power; }
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

class SmartTv extends Tv { // 자식
	String text;
    void caption() { }
}


//참조변수 타입과 인스턴스의 타입 일치 
Tv t = new Tv();
SmartTv s = new SmartTv(); //-> 7개의 멤버를 모두 쓸 수 있다

//다형성은 타입이 일치해야하지만 불일치해도 ok - 조상타입 참조변수로 자손타입 객체를 다루는 것 
Tv t = new SmartTv(); //-> 스마트티비를 티비 참조변수로 다루면 부모에 있는 5개 멤버만 참조변수로 사용 가능 
  • 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다
Tv t = new SmartTv(); //-> 가능

SmartTv s = new Tv(); //-> 에러, 불가능

메소드 출력결과 - 같은 배열에 집어넣어도 각각의 인스턴스에 따라 결과가 다르게 나온다, 상속이어도 인스턴스 타입 따라감
* 이게 바로 다형성 (Polymorphism)


참조변수의 형변환

참조변수를 변경해서 사용할 수 있는 멤버의 갯수를 조절하기 위해 사용

1) 서로 상속관계에 있는 타입간 형변환만 가능

2)자손타입, 조상타입을 형변환하는 경우

자손타입 -> 조상타입 (Up-casting) : 형변환 생략가능
자손타입 <- 조상타입 (Down-casting) : 형변환 생략불가

class Car { //부모 클래스 
	String color;
    int door;
    
    void drive() { 
    	System.out.println("drive");
    }
    
    void stop() { 
    	System.out.println("stop!");
    }
}

class FireEngine extends Car { //Car를 부모로 하는 자식 클래스
	void water() {
    	System.out.println("water!");
    }    
}
FireEngine f = new FireEngine(); 

Car c = (Car)f; //조상인 Car타입으로 형변환 가능 (생략가능)
FireEngine f2 = (FireEngine)c; //자손인 FireEngine타입으로 형변환 가능 (생략불가)
Ambulance a = (Ambulance)f; //-> 에러 : 상속관계가 아닌 클래스간 형변환 불가 

instance of 연산자

참조변수의 형변환 하기전 형변환 가능 여부를 확인할 때 사용

  • 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용된다.
  • instanceof의 연산결과가 true면 해당 타입으로 형변환이 가능하다. -> 형변환 전 반드시 instance of로 확인
void doWork(Car c) {
	if(c instanceof FireEngine) { //1. 형변환이 가능한지 확인 -> true가 나오면 가능 
    	FireEngine fe = (FireEngine)c; //2. 형변환
        fe.water();
    }
    ...
    FireEngine fe = new FireEngine(); 
    System.out.println(fe instanceof Object); //true
    System.out.println(fe instanceof Car); //true
    System.out.println(fe instanceof FireEngine); //true
}

매개변수 다형성

  • 참조형 매개변수는 메소드 호출시 자신과 같은 타입/자손 타입의 인스턴스를 넘겨줄 수 있다.

다형성의 장점 :
1) 다형적 매개변수
2) 하나의 배열로 여러종류 객체 다루기

class Product { //부모 
	int price;
    int bonusPoint;
}

//자손 
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}

class Buyer {
	int money = 1000;
    int bonusPoint = 0;
}


//오버로딩 - 메소드 이름이 같고 매개변수 타입만 다름 
void buy(Computer c) {
	money -= c.price;
    bonusPoint +=c.bonus;
}
void buy(Audio a) {
	money -= a.price;
    bonusPoint +=a.bonus
}

//메소드를 여러개 써줄 필요 없이 이 메소드 하나로 적용해줄 수 있다 - 이러지 않으면 물견 별 항목에 하나하나 메소드 추가해줘야함 
void buy(Product p) {
	money -= p.price;
    bonusPoint += p.bonusPoint;
}
profile
배우는 초보개발자

0개의 댓글