JAVA

[Java] 다형성(polymorphism)

yujin0517 2022. 8. 31. 14:14

다형성(polymorphism)

-> 다형성은 다양한 형태 또는 특성을 가진다는 의미입니다. 

자바와 같은 객체 지향 언어에서 의미는 부모 클래스를 상속받은 자식 클래스의 인스턴스가 부모의 객체로 사용되고, 자식 클래스의 객체로도 사용될 수 있는 다양한 상황을 의미합니다. 

 

<예시 1>

예를 들어, "앵무새가 말을 하네"라는 문장은  "새가 말을 하네"라는 문장으로 사용하여도 어색하지 않습니다. 앵무새가 새의 한 종류이기 때문에 같은 의미로 사용 가능합니다. 

class Bird {}

class Parrot extends Bird {}

public class Main {
	public static void main(String[] args) {
    	Bird b1 = new Bird();
        Parrot p1 = new Parrot();
        Bird b2 = new Parrot();
        //Parrot p2 = new Bird(); //모든 새는 앵무새가 아니기에 오류!
    }
}

 

즉, 하위 클래스의 인스턴스는 보다 위의 상위 클래스의 인스턴스로 사용할 수 있습니다. 하지만 그 반대는 불가합니다. (모든 새는 앵무새가 아니기 때문...)

 

<예시 2>

class Person { // 부모클래스 
	String st1 = "super class";
    
	void method1() {
		System.out.println("AAA");
	}
    
	void ppp() {
		System.out.println("PPP");
	}
}

class Student extends Person{ //자식클래스 
	String st2 = "surve class";
    
	void method1() { 
		System.out.println("overriding - aaa"); 
	}
    
	void sss() { 
		System.out.println("SSS"); 
	}
    
	//자식클래스에서 오버라이딩된 부모클래스의 원본 메소드를 호출하고 싶다면? -> super 사용 
	void x() { 	
		super.method1(); //AAA 출력됨
	}
}

public class day3_ex02 { 
	public static void main(String[] args) {
		//**객체를 어느 클래스 타입으로 선언 하냐에 따라 자원을 쓸 수 있는 범위가 달라진다!!**
	  
		//[1] 
		Student s1 = new Student(); 
		System.out.println(s1.st1); //super class
		System.out.println(s1.st2); //surve class
		s1.method1(); //overriding - aaa 
		s1.x(); //AAA
		System.out.println("------------------------");
	  
	  	//[2] 
		Person s2 = new Student(); //부모의 자원만을 쓸 수 있다.(자식의 자원을 쓸 수 없다.)
		s2.method1(); //overriding - aaa => **이건 자식의 자원(재정의 되었기 때문)**
		System.out.println(s2.st1); //super class (부모의 자원)
		s2.ppp(); // PPP (부모의 자원) 
		
		//자식클래스의 메소드를 바로 호출하고 싶다면? -> 캐스트 사용!!
		((Student)s2).sss(); //SSS(자식의 자원)
		System.out.println("------------------------"); 
        
		//[3]
		Person p1 = new Person(); 
		System.out.println(p1.st1); //super class
		p1.method1(); //AAA 
		p1.ppp(); //PPP
		  
		//[4] 
		//Student p2 = new Person(); //Error 발생!(모든 사람은 학생이 아니기 때문) 
	} 
}

 

  • super 키워드

-> super 키워드의 사용으로 자식 클래스의 객체는 부모 클래스의 자원을 사용할 수 있습니다. 

즉, super 키워드는 자식 클래스에서 오버 라이딩된 부모 클래스의 원본 메서드를 호출하는 방법입니다. 

//자식 클래스의 메소드 부분
void x() {
	super.method1(); // 부모 클래스의 method1
}

 

  • 캐스트 사용

-> 다형성의 특성으로 부모 클래스 타입으로 선언된 생성된 객체의 경우 부모 클래스의 자원만 사용할 수 있습니다. 

여기서 자식의 자원을 사용하기 위해서는 캐스트를 사용하는 방법이 있습니다. 

Person s2 = new Student();

//s2.sss(); //바로 자식 클래스의 메소드를 호출할 수 없음.
((Student)s2).sss(); // SSS 출력됨! -> 캐스트 사용

 

<예시 2 - 콘솔>

[1]
[2]
[3]

 

 

감사합니다!

 

2022.08.31

'JAVA' 카테고리의 다른 글

스레드(Thread)  (1) 2024.01.27
소수 찾기, 구하기  (0) 2023.02.01
[Java] 추상 클래스(abstract)  (0) 2022.08.19
[Java] 오름차순, 내림차순 정렬  (0) 2022.08.17
[자바] 싱글톤 패턴(Singleton pattern)  (0) 2021.07.14