(객체지향 프로그래밍)다형성

Backend kwon·2023년 4월 18일

다형성(polymorphism)

  • 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것

  • 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것

  • 참조 변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수

  • 메서드 오버라이딩과 메서드 오버로딩 또한 다형성의 한 예시
    (하나의 객체가 여러 가지 형태를 가질 수 있는 성질)

 

참조 변수의 타입 변환

조건

  • 서로 상속 관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능

  • 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형 변환 연산자(괄호)를 생략할 수 있다

  • 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형 변환 연산자(괄호)를 반드시 명시해야 한다.
    (다운 캐스팅은 업 캐스팅이 되어 있는 참조 변수에 한해서만 가능하다)

 

instanceof 연산자

  • 참조 변수의 타입 변환, 즉 캐스팅이 가능한지 여부를 boolean 타입으로 확인할 수 있다.
참조_변수 instanceof 타입

리턴 값이 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false가 나오는 경우에는 타입 변환이 불가능하다.

 

다형성의 활용

void buyCoffee(Americano americano) { // 아메리카노 구입
    money = money - americano.price;
}

void buyCoffee(CaffeLatte caffeLatte) { // 카페라테 구입
    money = money - caffeLatte.price;
}

커피의 종류가 수십 수백 가지가 된다면 매번 새로운 타입을 매개 변수로 전달해 주는 buyCoffee 메서드를 계속 추가해주어야 할 것이다.

void buyCoffee(Coffee coffee) { // 매개 변수의 다형성
    money = money - coffee.price;
}

그러나 위와 같이 객체의 다형성을 활용하여
상위클래스인 Coffee의 타입을 매개 변수로 전달받으면, 그 하위클래스 타입의 참조변수면 어느 것이나 매개 변수로 전달될 수 있고 이에 따라 매번 다른 타입의 참조변수를 매개 변수로 전달해주어야 하는 번거로움을 훨씬 줄일 수 있다.

profile
백엔드개발자를 향해서

0개의 댓글