본문 바로가기

개발언어/Java _ Spring

다형성(Polymorphism)

1.다형성(Polymorphism)

    다형성은 대입되는 객체에 따라 메서드를 다르게 동작하도록 구현하는 기술이다.

이는 실행도중 동일한 이름의 메서드 호출(오버라이드)에도 각각의 메서드를 선택할 수 있다는데에 큰 특장점이 있다.

종류가 다른 객체라도, 비슷한 동작의 메서드를 모아 관리해 간결한 코드를 유지할 수 있다.

위 그림에서, Animal이라는 부모객체에서 동물의 공통적인 '울음소리' 나타내는 sound()라는 메소드를 정의하였다고 가정한다.

동물클래스인 Dog, Cat, Duck은 각각 Animal 클래스를 상속받아

sound()를 각각의 특성에 맞게 재정의 하여 실행한다

그 결과

Dog의  sound() : Bow Bow / Cat의 sound() : meow meow / Duck의 sound() : quack quack

이처럼 sound()라는 동일한 메소드를 전달하지만 각각의 클래스는 다르게 반응하도록 할 수 있는 것이다.

 

앞서 언급한 오버라이딩(Overriding)과 오버로딩(Overloading)이 메서드의 다형성의 예시이다.

 

 

 

자 그럼, 이제 다형성을 이용한 객체를 생성해 볼까?

 

 

2.다형성의 조건

  1. 상속 클래스의 구현(부모-자식 클래스 구현)
  2. 메소드 오버라이딩
  3. 업캐스팅한 객체선언
  4. 부모 클래스의 객체로 자식 메소드 호출

 

 

 

3. 클래스 선언과 객체생성

    객체를 생성할 때에는 new 연산자를 사용하는데, 이 연산자는 생성한 객체의 주소를 반환한다.(→변수의 이름에!)

 

 객체를 생성할 때

해당 객체를 자료형이나 클래스를 규정하여 해당 객체의 타입을 지정해주고

참조할 변수의 이름을 지정하여, 해당 변수에 주소값을 받아 변수로서 객체를 활용한다.

클래스 이름(자료형) 변수 = new 클래스 이름() ;

그리고 다형성을 가능케 하는 상속을 포함한 객체의 생성은 4가지 경우의 수가 있다.

		문법	 =  메모리
	
		Aaa t1 = new Aaa();	 	// 부모 = 부모
		t1.f1();	//상속의 의미두지 않아도됨
		
		Aaa t2 = new Bbb(); 	// 부모 = 자손(up casting)
		t2.f1();
		t2.f3();	//부모의 객체로 자손의 재정의된 메소드를 호출할 수 있다
		//Bbb t3 = new Aaa();	 // 자손 = 부모 ... 자바에서는 불가!(down casting)
//		//
//		
		Bbb t4 = new Bbb(); 	// 자손 = 자손
		t4.f1();
		t4.f2();    //상속받아 모두 사용

일반적인 객체생성과 크게 다르지 않는 1,4의 경우는 상속받은 메서드를 모두 사용한다는것 이외에는 큰 차이가 없고 다형성의 특성을 띄지 않는다.

 

주목해야할 부분은 < 부모의 형태로 생성한 자식 객체> 의 형태이다.

 

  • 부모의 객체로서 - 메서드 호출하는데, 자손의 재정의된 메서드를 호출하거나,
  • 별개의 새로운 클래스를 정의하고
    매서드에 해당 부모클래스를 매개변수삼아 관련된 자손의 매서드를 호출 할 수 있다. 

 

이로서 재사용성이 획기적으로 증가되어 중복된 코드를 줄일 수 있으며

유지보수가 쉬워지고

클래스간에 느슨한 결합도로서 높은 안정성과 함께 유연한 상호작용이 가능해진다.

 

 


아래의 예시코드를 확인해보자

 

package pack01;					//다형성 예시코드


class Aaa{
	void f1() {System.out.println( "부모 메소드 f1" );}
	
	void f3() {System.out.println( "부모 메소드 f3" );}
}
class Bbb extends Aaa{
	void f2() {System.out.println( "Bbb자식 메소드 f2" );}
	
	void f3() {System.out.println( "Bbb자식 메소드 f3" );}
}
class Ccc extends Aaa{
	void f2() {System.out.println( "Ccc자식 메소드 f2" );}
	
	void f3() {System.out.println( "Ccc자식 메소드 f3" );}
}
class Ddd{
	void f1000(Aaa a) {	// Aaa t5 = new Bbb();
		a.f3();				// Aaa t6 = new Ccc();
		
	}
}

public class Ex19_Polymol {
	public static void main(String[] args) {
		Aaa t5 = new Bbb();		// 부모의 객체에 자손(Bbb)인스턴스의 주소값을 담는다 ( 자손Bbb을 가르킨다 )
		t5.f1();	// 부모에게만 있는 f1()메소드는 부모식대로 실행한다
		t5.f3();	// 부모와 자식클래스 모두 있는 f3()는 오버라이딩으로 자식의 f3()를 우선 실행한다
		
		Aaa t6 = new Ccc(); // 부모의 객체에 자손(Ccc)인스턴스의 주소값을 담는다 ( 자손Ccc을 가르킨다 )
		t6.f1(); // 부모에게만 있는 f1()메소드는 부모식대로 실행한다
		t6.f3();	//마찬가지로, 자식(Ccc클래스)의 f3()를 실행한다.

		//--------------------다형성의 꽃이 피었다!
		Ddd t7 = new Ddd();
		
		t7.f1000(new Bbb());
		t7.f1000(new Ccc());
		
		
	}

}

 

 

 

 

'개발언어 > Java _ Spring' 카테고리의 다른 글

스프링 입문 _ 섹션2. 스프링 웹 개발 기초  (0) 2022.12.05
자바_this의 활용  (0) 2022.08.18
for문  (0) 2022.08.03
조건문 if  (0) 2022.08.02
변수2 / 연산과 형 변환  (0) 2022.08.01