자바 (ref. 자바의정석)

다형성(polymorphsim) - JAVA

쿠쿠s 2022. 2. 18. 15:08

 

다형성이란?

 

다형성은 객체지향프로그래밍 개념 중요한 특징 중의 하나이다. 이유는 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용되기 때문입니다. 

 

 

그래서 다형성을 정의해보면 '여러 가지 형태를 가질 수 있는 능력' 을 의미합니다. 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로 다형성을 프로그램적으로 구현하였습니다. 부모 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 만든 것입니다. 이때 참조 변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 참조가 가능합니다.

 

 

말이 어렵게 느껴지면 부모는 자식을 품을 수 있지만, 자식은 부모를 품을 수 없다 라고 생각하시면 됩니다.

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