다형성(Polymorphism)

김수민·2023년 3월 11일
0

백엔드 부트캠프

목록 보기
15/52

다형성

  • 다형성: 하나의 객체가 여러 가지 형태를 가질 수 있는 성질, 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것 (상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것)

참조 변수의 타입 변환

  • 참조 변수의 타입 변환: 사용할 수 있는 멤버의 개수를 조절하는 것
  • 세 가지 조건을 충족해야 함
    1. 서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능함
    2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있음
    3. 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야함
    • 다운캐스팅은 업캐스팅이 되어있는 참조변수에 한해서만 가능함

instanceof 연산자

  • instaceof 연산자: 캐스팅이 가능한지 여부를 boolean 타입으로 확인할 수 있는 자바의 문법요소
  • 참조_변수 instanceof 타입을 입력했을 때 리턴 값이 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false가 나오는 경우에는 타입 변환이 불가능. 참조 변수가 null인 경우에는 false를 반환

다형성의 활용 예제

public class PolymorphismEx {
  public static void main(String[] args) {
    Customer customer = new Customer();
    customer.buyCoffee(new Americano());
    customer.buyCoffee(new CaffeLatte());

    System.out.println("현재 잔액은 " + customer.money + "원 입니다.");
  }
}

class Coffee {
  int price;

  public Coffee(int price) {
    this.price = price;
  }
}

class Americano extends Coffee {
  public Americano() {
    super(4000); // 상위 클래스 Coffee의 생성자를 호출
  }

  public String toString() {return "아메리카노";}; //Object클래스 toString()메서드 오버라이딩
};

class CaffeLatte extends Coffee {
  public CaffeLatte() {
    super(5000);
  }

  public String toString() {return "카페라떼";};
};

class Customer {
  int money = 50000;

  void buyCoffee(Coffee coffee) {
    if (money < coffee.price) { // 물건 가격보다 돈이 없는 경우
      System.out.println("잔액이 부족합니다.");
      return;
    }
    money = money - coffee.price; // 가진 돈 - 커피 가격
    System.out.println(coffee + "를 구입했습니다.");
  }
}

// 출력값
아메리카노를 구입했습니다.
카페라떼를 구입했습니다.
현재 잔액은 41000원 입니다.

0개의 댓글