본문 바로가기
JAVA

다형성 Polymorphism

by zkzk7290 2024. 10. 2.
반응형
다형성 ( Polymorphism): 많은 형태를 가질 수 있는 능력
하나의 객체가 여러 타입의 인스턴스(객체)로 취급 될 수 있는 특성
상속 + 메서드 오버라이딩 + 클래스 타입 변환

- 여러 객체들 중 공통 특성으로 타입을 추상화하고 그것을 상속(인터페이스라면 구현)해야한다

- 부모 클래스 타입의 참조 변수자식 클래스 객체를 참조한다 

 


장점
코드 재사용성(Reuse) : 다형성을 사용하면 코드의 재사용성이 높아져서   동일한 코드가 다른 클래스에서 재사용될 수 있으므로, 개발자는 코드의 중복을 줄이고 생산성을 향상시킬 수 있다
유연성(Flexibility) : 다형성을 사용하면 객체의 형식을 추상화하고, 이를 사용하는 다른 객체에서 동일한 인터페이스를 사용할 수 있다 . 이를 통해 객체 간의 결합도를 낮추고, 코드의 유연성과 확장성을 높일 수 있다.
코드 가독성(Readability) : 다형성을 사용하면 동일한 이름을 가진 메서드나 연산자가 서로 다른 동작을 하기 때문에, 코드의 가독성이 높아진다. 이를 통해 개발자는 코드를 더 쉽게 이해하고, 유지보수를 수행할 수 있다.


단점
복잡성(Complexity) : 다형성을 사용하면 코드의 복잡성이 증가할 수 있다. 다른 클래스에서 동일한 이름의 메서드나 연산자를 사용하기 때문에, 코드의 동작을 이해하는 데 어려움이 있을 수 있다.
오버헤드(Overhead) : 다형성을 사용하면, 런타임 시에 메서드나 연산자의 동작을 결정하기 위해 추가적인 연산이 필요할 수 있다. 이를 통해 일부 성능 손실이 발생할 수 있다.
디버깅(Difficulty of debugging) : 다형성을 사용하면, 코드의 실행 경로가 다양해져 디버깅이 어려울 수 있다. 이를 위해 디버깅을 위한 툴과 기법을 익혀야 하며, 이는 추가적인 학습 비용이 발생할 수 있다.

 

 

instanceof 연산: 참조변수값 instanceof 타입(클래스명)
해당 객체가 특정 클래스의 인스턴스인지 또는 그 클래스를 상속받은  자식 클래스의 인스턴스인지를 확인

 

 

다형성예제 - 주석 꼼꼼히 

class Vehicle {
	void display() {
		System.out.println("운송수단입니다.");
	}
}

class Bus extends Vehicle {
	@Override
	void display() {
		System.out.println("버스를 타고 갑니다.");
	}
}

class Subway extends Vehicle {
	@Override
	void display() {
		System.out.println("지하철을 타고 갑니다.");
	}
}

public class B_Polymorphism {
	public static void main(String[] args) {
		
		
		Vehicle myVehicle = new Vehicle(); // Vehicle 객체
		Vehicle myBus = new Bus(); // Bus 객체(자동 타입 변환)
		Vehicle mySubway = new Subway(); // Subway 객체(자동 타입 변환)
		
		if (myBus instanceof Vehicle) {
			// myBus 객체가 Vehicle의 인스턴스 이거나 
			// , 해당 클래스를 상속받은 클래스의 인스턴스 인 경우
			myBus.display(); // 버스를 타고 갑니다.
		}
		
		if (myVehicle instanceof Bus) {
			System.out.println("운송수단은 버스입니다.");
		} else {
			System.out.println("운송수단은 버스가 아닙니다.");
			// 운송수단은 버스가 아닙니다.
		}

cf) instanceof 연산자 계산식에서 true의 결과값이 출력되면

> 해당 클래스 타입으로 형 변환이 가능

> 형 변환 이전에는 instanceof 연산자를 통해 오류 방지

 

반응형

'JAVA' 카테고리의 다른 글

Stramp API  (1) 2025.05.02
interface 인터페이스  (0) 2024.10.04
캡슐화  (0) 2024.09.25
상속(inherence)- extends, super();  (2) 2024.09.23
접근제한자  (1) 2024.09.23