다형성이란?
다형성은 객체지향프로그래밍 개념 중요한 특징 중의 하나이다. 이유는 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용되기 때문입니다.
그래서 다형성을 정의해보면 '여러 가지 형태를 가질 수 있는 능력' 을 의미합니다. 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로 다형성을 프로그램적으로 구현하였습니다. 부모 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 만든 것입니다. 이때 참조 변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 참조가 가능합니다.
말이 어렵게 느껴지면 부모는 자식을 품을 수 있지만, 자식은 부모를 품을 수 없다 라고 생각하시면 됩니다.
class Parent { ... }
class Child extends Parent { ... }
Parent pc = new Child(); // 가능
Child cp = new Parent(); // 에러!!
다형성을 활용한 코드로 설명을 드리겠습니다.
import java.util.Scanner;
class Car{
String name;
int price;
int maxSpeed;
}
class Avante extends Car {
public Avante() {
this.name = "아반떼";
this.price = 2000;
this.maxSpeed = 220;
}
}
class K7 extends Car {
public K7() {
this.name = "K7";
this.price = 5000;
this.maxSpeed = 260;
}
}
class Porsche extends Car{
public Porsche() {
this.name = "포르쉐911";
this.price = 11000;
this.maxSpeed = 350;
}
}
class People{
int money;
public People(int money) {
this.money = money;
}
void drive(Car car) {
System.out.println("내 차 이름은= \"" + car.name +
"\" 이고 가격은= \"" + car.price + "\" 이지 " +
"최대 속도는= \"" + car.maxSpeed + "\" 까지 나와");
}
}
class PolymorphismEx {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int money = sc.nextInt();
People user = new People(money);
// user가 가진 돈에 따라 생성되는 인스턴스가 다르다! 여러 형태를 가질 수 있다.
Car userCar = myCar(user.money);
user.drive(userCar);
}
public static Car myCar(int money) {
if (money >= 2000 && money < 5000) {
return new Avante();
}
if (money >= 5000 && money < 11000) {
return new K7();
}
if (money >= 11000) {
return new Porsche();
}
System.out.println("차를 가질 수 없다ㅠㅠ");
System.exit(0);
return null;
}
}
[출력결과]
입력 3000 : 내 차 이름은= "아반떼" 이고 가격은= "2000" 이지 최대 속도는= "220" 까지 나와
입력 7000 : 내 차 이름은= "K7" 이고 가격은= "5000" 이지 최대 속도는= "260" 까지 나와
입력 40000 : 내 차 이름은= "포르쉐911" 이고 가격은= "11000" 이지 최대 속도는= "350" 까지 나와
입력 500 : 차를 가질 수 없다ㅠㅠ
Avante, K7, Porsche 클래스들은 Car 클래스를 상속받습니다.
People 클래스를 만들어 인스턴스변수인 money와 메서드 drive를 만들었는데 파라미터로 Car타입을 받습니다.
메인문에서 유저를 인스턴스를 생성할 때 돈을 입력받습니다. Car 타입이 무엇인지 myCar 메서드를 통하여 Car 타입을 반환하도록 설정하였습니다.
사용자가 입력한 값에 따라 유저의 자동차를 다른 타입으로 설정이 가능하며 상단에 설명한 것 처럼 다형성을 활용하면 프로그램을 유연하고 변경이 용이하게 만들 수 있습니다.
잘못된 정보가 있거나 궁금하신점은 댓글에 남겨두시면 빠르게 반영하겠습니다!
'자바 (ref. 자바의정석)' 카테고리의 다른 글
String 클래스 - JAVA (0) | 2022.02.24 |
---|---|
인터페이스(interface) - JAVA (0) | 2022.02.21 |
오버라이딩(overriding) + super( ) - JAVA (0) | 2022.02.17 |
상속(inheritance) - JAVA (0) | 2022.02.16 |
생성자 (Constructor) - JAVA (0) | 2022.02.15 |