본문 바로가기

자바의 정석 정리

자바의 정석 - 7.8 다형성

7.8.1 다형성(polymorphism)

  • 여러 가지 형태를 가질 수 있는 능력
  • 부모 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있는 것
Parent p = new Child();
  • 다형성을 사용하는 경우 부모의 타입 참조변수는 자식에서 선언한 멤버 사용 불가
class Parent{
    int a;
}
class Child extends Parent{
    int b;
}

Parent p = new Child();
p.a //가능
p.b //불가

7.8.2 참조변수의 형변환

  • 자식 → 부모(Up-casting) : 형변환 생략가능
  • 자식 ← 부모(Down-casting) : 형변환 생략불가
class Car{}
class FireEngine extends Car{
    void water(){};
}
class Abulancce extends Car{}

Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = new FireEngine();

car = fe //업 캐스팅
fe2 = (FireEngine)car; //다운 캐스팅

//Error
car.water();

/*
참조변수 car안에는 water가 없기 때문에 사용 불가
*/

7.8.3 instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입 검사
  • boolean값 반환
void do(Car c){
    if(c instanceof FireEngine){
        FireEngine fe = (FireEngine )c;
    }else{}
}

7.8.4 매개변수의 다형성

  • 매개변수에 부모 클래스를 할당하고 다형성을 통해 코드 간결화
class Product{
    int price;
    Product(int price){
        this.price = price;
    }
}
class Tv extends Product{
    Tv(){
        super(100);
    }
}
class Audio extends Product{
    Audio(){
        super(200);
    }
}
class Buyer{
    int buy(Product p){
        count = p.price;
        return count;
    }
}

class Test{
    public static void main(String[] args){
        Tv t = new Tv();
        System.out.println(new Buyber().buy(t))
    }
}

7.8.5 Vector 클래스

  • 동적 객체배열
  • Vector 클래스를 객체 배열을 컨트롤
  • Vector 클래스는 내부적으로 Object타입의 배열을 가지고 있어서, 객체의 추가 및 제거 가능
  • 생성자 및 메서드
  1. Vector()
  2. boolean add(Object o)
  3. boolean remove(Object o)
  4. boolean isEmpty()
  5. Object get(int index)
  6. in size()