본문 바로가기
Language/Java

자바 다형성(Polyporhism)이란? & 예제

by wakestand 2019. 11. 12.
반응형

자바에서 다형성(Polyporhism)은 간단한 개념인데

대부분이 설명을 너무나도 어렵게 해서 쉬운 개념인데도 이해가 힘들다

 

일단 다형성이란 큰 객체 안에 작은 객체를 넣어서 여러 형태로 변환해 사용하는 것인데

코드를 통해 한번 알아보자

 

처음 볼 코드는 Human 클래스와, Human 클래스를 상속받는 Cheolsu 클래스다

여기서 큰 개념의 클래스는 Human이고

Cheolsu 클래스는 Human을 상속받기 때문에 작은 개념의 클래스라 볼 수 있다

 

실제 테스트 시 큰 개념인 Human에 Cheolsu를 넣어 정의할 수 있는데

여기서 껍데기는 Human이지만 안의 내용은 Cheolsu이기 때문에

call 메소드를 호출할 시 Cheolsu Call이 호출되고

Cheolsu에 들어있는 Status 메소드는 호출할 수 없다

 

왜냐면 Human 객체에는 Status 메소드가 없어서

Cheolsu 객체를 가져다 넣는다 해도 내용만 가져다 넣는것이지

메소드까지 넣어주는게 아니기 때문이다

 

동일한 내용을 한번 더 복습해본다

 

이번에는 Champion 인터페이스와

Champion을 implements 받는 Garen 클래스인데

 

여기서 Champion이 더 큰 개념이고

Garen이 작은 개념이라 볼 수 있다

 

이제 개념이 좀 정리가 될 텐데

큰 개념에는 작은 개념을 넣을 수 있지만

작은 개념에는 큰 개념을 넣을 수 없다

 

챔피언은 가렌이라고 할 수 있지만

가렌이 모든 챔피언이 될 수는 없는 것과 같은 말이다

 

정리해보자면 다음과 같은데

큰 개념에 작은 개념의 클래스를 넣어 정의시킨 뒤에

작은 개념의 값을 사용할 수 있다

이걸 바로 다형성(Polyporhism) 이라고 하는 것이다

 

실제 업무 시에 자주 보는 예제가 interface인 map 안에

HashMap이나 LinkedHashMap을 넣어서 사용하는 경우인데

 

Map 인터페이스 안에 HashMap과 LinkedHashMap이 들어있어 작은 개념이기 때문에

큰 개념인 Map에 HashMap과 LinkedHashMap을 넣어 사용할 수 있는 것이다

 

사용한 코드들은 아래를 참고해주면 된다

 

// 다형성 예제 : 큰 개념 Human
public class Human {
	
	public void call() {
		System.out.println("Human Call");
	}

}
// 다형성 예제 : 작은 개념 Cheolsu
public class Cheolsu extends Human {
	
	public void call() {
		System.out.println("Cheolsu Call");
	}
	
	public void status() {
		System.out.println("Cheolsu Status");
	}

}
// 다형성 예제 : 큰 개념 Champion
public interface Champion {
	public void call();
}
// 다형성 예제 : 작은 개념 Garen
public class Garen implements Champion {

	@Override
	public void call() {	
		System.out.println("Garen Call");
	}

}
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

// 다형성 사용 예제
public class PolymorphismTest {

	public static void main(String[] args) {
		
		// 다형성 예제
		Human h = new Cheolsu(); // Human 객체에 Cheolsu 객체를 넣음
		//Cheolsu c = new Human(); 
		// 작은 개념의 객체에 큰 개념의 객체를 넣을 수는 없음..
		h.call(); // Cheolsu Call이 나오게 됨
		// h.status(); // human에 존재하지 않는 메소드는 사용 불가
		
		Champion c = new Garen(); // Champion 객체에 Garen 객체를 넣음
		c.call(); // Garen Call이 나오게 됨
		
		Map<String, String> m = new HashMap<String, String>(); // 실 사용 예제
		Map<String, String> m2 = new LinkedHashMap<String, String>(); // 실 사용 예제 2		

	}

}
반응형

댓글