본문 바로가기
TIL

2024.04.19 42일차 JAVA 다형성

by Song.dev 2024. 4. 19.

 

다형성 Polymorphism

 

  1. 다형성이란 "객체가 여러 형태를 가진다" = 하나의 객체가 여러가지 타입으로 사용되는 것
  2. 다형성은 상속을 전제 조건으로 함
  3. 다형성을 위해 자바는 자식 클래스가 부모 클래스의 타입을 가질 수 있도록 허용
  4. 부모 타입에 모든 자식 객체가 대입 될 수 있음

** 객체지향 프로그래밍에서는 객체에 의존하지 않고 역할에 의존해야 함 (의존 = 종속)

 

 

다형성을 사용하는 이유

이종모음구조를 하나의 배열로 만들 수 있음 → 코드의 반복을 줄일 수 있음

오버라이딩된 메서드가 작동

 

//        Sonata sonata1 = new Sonata();
        Car sonata1 = new Sonata();

//        Tucson tucson1 = new Tucson();
        Car tucson1 = new Tucson();

        Car mustang1 = new Mustang();
        Car mustang2 = new Mustang();

        // 다형성을 통해 이종모음 배열을 구현할 수 있음
        Car[] cArr = {sonata1, tucson1, mustang1, mustang2};
        for (Car car : cArr) {
            car.accelerate();
        }

 

매개변수에 다형성 적용

자바는 타입을 정확히 지켜야하기 때문에 타입이 다른 메서드를 클래스 만큼 선언해야 함

다형성을 적용하면 메서드 오버로딩을 통해 일일히 구현해 주지 않아도 됨

    public void drive(Car car) {
        System.out.println("운전을 시작합니다.");
        car.accelerate();
    }

 

 

리턴 타입에 다형성 적용

리턴 타입 역시 자바는 정확히 지켜야 하는데 여러 타입을 반환하고자 할 때

다형성을 사용하면 하나의 메서드로 모든 자식 객체를 리턴 가능

    public Car exportCar(int money) {
        // 리턴 타입이 다양할 경우 다형성 활용
        if(money == 6000) {
            return new Mustang();
        } else if (money == 4000) {
            return new Tucson();
        } else if (money == 3000) {
            return new Sonata();
        } else {
            return null;
        }
    }

 

 

타입 캐스팅

 

자식 클래스를 부모 클래스로 선언하는 것은 자료형의 자동 형변환처럼 업캐스팅이 자동 적용됨

** 주의!! 부모타입을 자식타입으로 다운캐스팅은 불가능

 

자식을 부모 타입으로 업캐스팅 시 주의할 점

부모가 물려준 필드, 메서드는 작동하지만 자식만의 고유한 속성 및 기능은 사용 불가

자식의 고유 속성 및 기능을 사용하기 위해서는 2가지 방법이 있음

 

1. 자식 타입으로 자식 객체 선언 및 초기화 한 뒤 필요할 때 부모 타입으로 업캐스팅 적용

2. 형 변환 연산자를 이용하여 타입을 강제로 다운캐스팅 (단, 업캐스팅된 자식을 다운캐스팅하는 것만 가능)

public class Parent {
	public int n1;

	void method1() {...}
	void method2() {...}
}

public class Child extends Parent {
	public int n2;

	@override
	void method2() {...}
	void method3() {...}
}

//////////////////////////////////////////////////////////////////////

public class Main {
	Parent p = new Child();
	p.n1 = 1;
	//p.n2 = 2; (x)
	
	p.method1();
	p.method2();
	//p.method3(); (x)
}