๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
FOR SW ENGINEER๐Ÿ‘ฉ‍๐Ÿ’ป/JAVA

JAVA _๋‹คํ˜•์„ฑ(Polymorphism)

by ์”จ๋‹ˆ 2021. 9. 9.
728x90

 

โ˜…๋‹คํ˜•์„ฑโ˜…

 

 

1.๋‹คํ˜•์„ฑ์ด๋ž€

- ๋‹คํ˜•์„ฑ์ด๋ž€ : ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค, ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ.

- ๋‹คํ˜•์„ฑ์€ ์ƒ์†์„ ์ „์ œ์กฐ๊ฑด์œผ๋กœ ํ•จ.

- ๋‹คํ˜•์„ฑ์„ ์œ„ํ•ด ์ž๋ฐ”๋Š” ์ž์‹ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค ํƒ€์ž…์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•จ. ์ฆ‰, ๋ถ€๋ชจ ํƒ€์ž…์— ๋ชจ๋“  ์ž์‹๊ฐ์ฒด๊ฐ€ ๋Œ€์ž…๋ ์ˆ˜ ์žˆ์Œ.

 

 

โ–ถ๋‹คํ˜•์„ฑ ์˜ˆ์‹œ

//ํด๋ž˜์ŠคA์™€ A๋ฅผ ์ƒ์†๋ฐ›๋Š” B์™€Cํด๋ž˜์Šค
class A{}
class B extends A{}
class C extends A{}

public class Poly{

	//ํด๋ž˜์Šคํƒ€์ž… ๋ฉค๋ฒ„๋ณ€์ˆ˜
    A a = new A();
    B b = new B();
    
    //๋‹คํ˜•์„ฑ
    A a1 = b;  // A a1 = new B();
    		   // B -> Aํ˜• ๋ฐ˜ํ™˜
               // ๋ถ€๋ชจ ํƒ€์ž…A์— ์ž์‹ํƒ€์ž… B๋Œ€์ž…
               // ์ž์‹ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค ํƒ€์ž…์„ ๊ฐ€์ง€๊ฒŒ๋จ.
               
    A a2 = new B();
    A a3 = new C();
    
    //์šฐ์„ ์ˆœ์œ„ ๋†’์€ ๋ฐ”์ดํŠธ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋“ฏ์ด ๋‹คํ˜•์„ฑ์„ ๋˜‘๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด ๋จ
    byte x = 1;
    int y = x;   // byte -> int
    
    //++Object๋Š” ์ž๋ฐ”์˜ ๊ฐ€์žฅ ์ƒ์œ„๊ฐ์ฒด๋กœ ๋ชจ๋“  ๊ฐ์ฒด ์ €์žฅ ๊ฐ€๋Šฅํ•จ.
    Object o1 = new A();
    Object o2 = new B();
    Object o3 = "java";

++์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ๋ฐ์ดํ„ฐํ˜•์—์„œ ๋†’์€ ๋ฐ์ดํ„ฐ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹คํ˜•์„ฑ์„ ๋˜‘๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด ๋จ++

++Object๋Š” ์ž๋ฐ”์˜ ๊ฐ€์žฅ ์ƒ์œ„๊ฐ์ฒด์ž„++

 

 

โ–ถ๋‹คํ˜•์„ฑ ์‹คํ–‰์˜ˆ์ œ

Parentํด๋ž˜์Šค์™€, Parentํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” Childํด๋ž˜์Šค

//<Main๋ฌธ>
public class MainClass {
	public static void main(String[] args){
    	
        Child c = new Child();
        
        c.method1(); // ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ
        c.method2(); // ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์„œ๋“œ
        c.method3(); // ์ž์‹์˜ 3๋ฒˆ ๋ฉ”์„œ๋“œ
        
        Parent p = c; // Parent p = new Child();
        System.out.println(p == c); //Child๊ฐ€ Parent๊ธฐ๋Šฅ์„ ๊ฐ€์ง --> true
        
        p.method1();
        p.method2(); //์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๋ฉ”์„œ๋“œ ์‹คํ–‰๋จ. --> ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์ฝ”๋“œ ์šฐ์„ !
        p.method3(); //Child๊ฐ€ Parent๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ๋ถˆ๊ฐ€
        
        //
        // ์œ„์˜ ์˜ˆ์‹œ๋Š” "Child๊ฐ€ ๊ฐ–๋Š” ๊ณ ์œ ํ•œ ์„ฑ์งˆ ์žƒ์–ด๋ฒ„๋ฆผ"์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ
        //
        }
}

์œ„์˜ Main๋ฌธ ์‹คํ–‰๊ฒฐ๊ณผ

  

2. ํด๋ž˜์Šค ์บ์ŠคํŒ…(Casting)

- ํด๋ž˜์Šค ์บ์ŠคํŒ… = ํด๋ž˜์Šค ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜

- ๊ฐ•์ œ ํƒ€์ž…๋ณ€ํ™˜์€ ๋ถ€๋ชจ ํƒ€์ž…์„ ์ž์‹ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•จ.

- ๊ฐ์ฒด์—์„œ ํƒ€์ž… ์บ์ŠคํŒ… ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์šฐ์„  Promotion์ด ์ผ์–ด๋‚˜์•ผ ํ•จ. ์ฆ‰, ๋ถ€๋ชจํƒ€์ž…์œผ๋กœ ํ•œ๋ฒˆ ํ˜•๋ณ€ํ™˜์ด ๋œ ์ž์‹ ๊ฐ์ฒด๋งŒ ๊ฐ•์ œ ํƒ€์ž… ๋ณ€ํ™˜ ์‚ฌ์šฉ๊ฐ€๋Šฅ.

- Promotion์ผ์–ด๋‚˜๋ฉด ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์žฌ์ •์˜๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ.

  โ˜ž ์ด ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ ํƒ€์ž…๋ณ€ํ™˜ ์‚ฌ์šฉํ•ด ์ž์‹ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• ์‚ฌ์šฉ. 

 

โ–ถ๋‹คํ˜•์„ฑ ์˜ˆ์‹œ

์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ Parentํด๋ž˜์Šค์™€ Child๋“œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋Š” ์˜ˆ์‹œ

//<Main๋ฌธ>
public class MainClass{
	public static void main(String[] args){
    
    	// Child๊ฐ€ Parentํƒ€์ž…์œผ๋กœ ํ•œ๋ฒˆ ํ˜•๋ณ€ํ™˜์ด ๋˜๋ฉด์„œ Child๊ฐ€ ๊ฐ–๋Š” ๊ณ ์œ ํ•œ์„ฑ์งˆ์„ ์žƒ์–ด๋ฒ„๋ฆผ
    	Parent p = new Child();
        c.method3(); //์‹คํ–‰๋˜์ง€ ์•Š์Œ.
        
        
        //์œ„์˜ ๋‹จ์ ์„ ๋ณด์•ˆํ•˜๊ธฐ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ Casting(๊ฐ•์ œ ํ˜•๋ณ€ํ™˜)
        //Castingํ†ตํ•ด ๊ณ ์œ ํ•œ ์„ฑ์งˆ ๋˜์ฐพ์•„์˜ด.
        Child c = (Child)p;
        
        System.out.println(c == p); // true
        
        c.method1();
        c.method2();
        c.method3(); //๊ณ ์œ ํ•œ ์„ฑ์งˆ ๋˜์ฐพ์•„์™€ ์‹คํ–‰๋จ
    }
}

์œ„ MAIN๋ฌธ์˜ ๊ฒฐ๊ณผ

์œ„์˜ Main๋ฌธ์—์„œ Chlid๊ฐ€ Parentํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋Š” Child๋งŒ์˜ ๊ณ ์œ  ์„ฑ์งˆ์ด ์‚ฌ๋ผ์ ธ Child๋‚ด ๋ฉ”์„œ๋“œ method3์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋จ.

ํ•˜์ง€๋งŒ, ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•ด Child์˜ ๊ณ ์œ  ์„ฑ์งˆ์„ ์›์ƒ๋ณต๊ท€์‹œ์ผœ method3์„ ๋‹ค์‹œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ. 

 

โ–ถ์ค‘์š”!โ—€

 

  

3. ๋‹คํ˜•์„ฑ์ ์šฉ

โ–ถ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

- ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ๋ถ€๋ชจํ˜•์œผ๋กœ ์„ ์–ธํ•ด ํƒ€์ž… ํ†ต์ผ

 

โ–ถ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

- ๋ณดํ†ต ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ์—๋Š” ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์—์„œ ์ง€์ •ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š” ๋งค๊ฐœ๊ฐ’์„ ์ „๋‹ฌํ•ด ํ˜ธ์ถœํ•˜์ง€๋งŒ, ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋‹คํ˜•์„ฑ ์ ์šฉํ•˜๋ฉด ์ž์‹๊ฐ์ฒด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ.

 

โ–ถ๋ฐฐ์—ด์— ์ ์šฉํ•œ ๋‹คํ˜•์„ฑ

๋ถ€๋ชจํด๋ž˜์Šคํ˜• ๋ฐฐ์—ด์— ์ž์‹ํด๋ž˜์Šค ์–ธ์ œ๋“  ์ €์žฅ ๊ฐ€๋Šฅ.

 

Peronํด๋ž˜์Šค์™€, Personํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” Employee, Student, Teacherํด๋ž˜์Šค

 

 

โ–ถ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋”ฉ๊ณผ, ๊ทธ ์ฝ”๋”ฉ์„ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•ด ๋‚˜ํƒ€๋‚ธ ์ฝ”๋“œ.โ—€

 

++์œ„์˜ ์˜ˆ์ œ๋“ค์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋ณด๋‹ค ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ,

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์ด ๋†’์•„์ง์„ ๋ณผ์ˆ˜์žˆ์Œ++

728x90