Java/Java icia 15일차

Java 다형성의 대해

swkn 2023. 3. 14. 18:58

자바 다형성이란 ?

 

자바 다형성(polymorphism)은 객체지향언어의 특징 중 하나다.

 

1. 다형성이란 ?

다형성이란 하나의 객체나 메소드가 여러가지 다른 형태를 가질 수 있는 것이다.

자바에서 다형성을 나타내는 것으로는 , 오버라이딩과 오버로딩 그리고 상속받은 객체의 참조변수 형변환 등이 있다.

 

 

2. 형변환(Casting) 및 사용예제

상속받는 객체에 대해서 형변환이 의미하는 것은 객체에 속한 멤버들에 대한 사용범위가 달라진다는 것을 의미한다.

 

 - 업캐스팅(upcasting)

(자식 클래스의 인스턴스에 대한) 자식클래스의 타입의 레퍼런스 변수를 부모클래스 타입으로 형변환 하는것

( 타입변환 구문 생략 가능 , 자동 형변환됨 )

 - 다운캐스팅(downcasting)

(자식 클래스의 인스턴스에 대한) 부모클래스의 타입의 레퍼런스 변수를 자식클래스 타입으로 형변환 하는것

( 타입 변환 구문 생략 불가 , 형변환 타입을 명시해야한다 )

 

부모클래스와 자식클래스간의 객체 생성에 따른 형변환

 

Person 클래스의 정의 ( 부모클래스 )

public class Person {

	String name;
    int age;
    
    public void speak() {
    		system.out.println(name + ": 안녕하세요");
            }
 }

Dancer 클래스의 정의 ( 자식 클래스 )

public class Dancer extends Person {

	public void dance() {
    	system.out.println(name + ": 춤을 춥니다.");
        }
}

객체 생성 및 실행

public class HelloWorld {
	public static void main(String[] args) {

		//==================================
		System.out.println("==== 예시1 ====");
		//==================================
		Person p1 = new Dancer();
		
		p1.name = "홍길동";
		p1.speak();
		// p1.dance();  // 사용불가 
		
		Dancer d1 = (Dancer) p1;	// 다운캐스팅
		d1.name = "이순신";
		d1.speak();
		d1.dance();
		
		//==================================
		System.out.println("==== 예시2 ====");
		//==================================
		Dancer d2 = new Dancer();
		
		d2.name = "제갈공명";
		d2.speak();
		d2.dance();
		
		Person p2 = (Person) d2;	// 업캐스팅 - (Person) 생략가능
		p2.name = "신사임당";
		p2.speak();
		// p2.dance();  // 사용불가
		
	}
}

 

실행 결과

==== 예시1 ====
홍길동: 안녕하세요
이순신: 안녕하세요
이순신: 춤을 춥니다
==== 예시2 ====
제갈공명: 안녕하세요
제갈공명: 춤을 춥니다
신사임당: 안녕하세요

 

형변환(Casting)의 장점

- 형변환의 장점으로는 여러 자식 클래스 타입의 레퍼런스 변수들을 하나의 부모클래스 타입의 레퍼런스 변수로

다룰수 있다는 것입니다.

 

만약 아래와 같이 Person이라는 부모 클래스를 가진 자식클래스 Dancer , Singer , Actor가 있을 경우 , 부모클래스 타입으로 형변환하여 사용하게 되면 여러 장점이 있다.

1. 여러 자식 클래스 객체를 하나의 배열로 다룰수 있다.

2. 메소드의 매개 변수를 부모클래스 타입 하나로 전달받아 사용할 수 있다.

 

Person클래스를 상속받는 Dancer , Singer , Actor클래스