[Java] 객체지향 프로그래밍 - 다형성

·2022년 9월 8일
0

Java

목록 보기
5/14
post-thumbnail

다형성

다형성

다형성이란?

  • 하나의 객체가 여러 가지 형태를 가질 수 있는 성질

    💡상위 클래스 타입의 참조변수로 하위 클래스 타입의 객체를 다루는 것

다형성의 예제 코드

class Tv {
	boolean power;
    int channel;
    
    void power(){...}
    void channelUp(){...}
    void channelDown(){...}
}

class SmartTv extends Tv {
	String text;
    void caption(){...}
}

Tv t = new Tv();
SmartTv s = new SmartTv();

이것처럼 참조 변수를 선언할 때 두 개의 타입이 같아야 하지만

Tv t = new SmartTv(); 

이와 같이 타입이 불일치 하더라도 사용이 가능한 것을 다형성이라고 한다., 상위 클래스가 하위클래스의 객체를 정의할 때에만 가능

SmartTv s = new Tv(); // 에러 발생


상위클래스의 타입으로 선언한 t는 5개의 버튼을 가지지만 하위 클래스로 인스턴스를 생성하였기 때문에 7개의 멤버를 가진다.

💡 가지고 있는 기능을 실행할 버튼이 없는 것은 괜찮지만 버튼이 있음에도 구현되는 기술이 없는 것은 문제!

참조변수의 형변환

  • 사용할 수 있는 멤버의 개수를 조절하는 것 (실제 인스턴스의 멤버 개수에서 많아질 수 없다.)
  • 주소값이나 객체의 값이 바뀌는 것이 아님.

형변환을 위한 조건

  1. 서로 상속관계에 있는 클래스 사이에만 변환이 가능
  2. 상위에서 하위, 하위에서 상위 형변환이 가능
  3. 단, 참조변수가 가리키는 인스턴스의 하위 클래스 타입으로 변환은 불가

    💡 하위클래스로 다운캐스팅을 하기 위해서는 업캐스팅이 선행되어야 한다.
    이 때문에 instanceof 연산자로 확인 후 형변환을 하는 것이 안전!
    💡 실제 객체가 중요! 실제 객체의 멤버 수 이상으로 늘어날 수 없다.

예제 코드


컴파일 에러는 발생하지 않아 실행을 해봤더니 ClassCastException 에러가 발생 했다.
이는 생성된 참조변수 c가 Car 클래스의 인스턴스이기 때문이다.

water 메서드는 Car 클래스를 상속 받은 FireEngine 클래스에서 만들어진 메서드이기 때문에 Car 클래스로 생성된 인스턴스는 형변환을 하더라도 water 메서드가 생성되지 않는다.

instanceof 연산자

  • 참조변수의 형변환 가능여부를 확인하는 데에 사용한다.
  • boolean값을 리턴
  • 형변환을 행하기 전에 반드시 instance연산자를 사용하여 확인해야 한다.

    왼쪽은 예상한 값 오른쪽은 결과 값이다.

    💡 참조변수 ani는 Animal클래스의 인스턴스이기 때문에 Anmimal 클래스에 상속받아 확장된 Bat 클래스로 변환이 불가능하다. -> 사용하지 못할 리모컨 버튼이 생길 수도 있기 때문에

다형성의 장점

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 하위 클래스의 인스턴스를 넘겨줄 수 있다.
  • 예제 코드
class Product {};
class Tv extends Product {};
class Computer extends Product {};

void buy(Tv t) {
	money = money - t.price;
    }
void buy(Computer c) {
	money = money - c.price;
    }
.
.
.
=> 하나로 변경 가능
void buy(Product p) {
	money = money - p.price;
    }

💡 여러번 작성해야 하는 코드를 상위 클래스 참조변수를 매개변수로 사용하여 그 밑에 있는 하위 클래스도 하나의 메서드로 사용할 수 있다.

여러 종류의 객체를 배열로 다루기

  • 상위 클래스 타입의 배열에 하위 클래스 객체를 담을 수 있다.
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();

===>

Product p[] = new product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글