1. 다형성이란?
다형성(Polymorphism)은 “많은(Poly) + 모양(morphism)” 이라는 의미로써
같은 이름의 메서드나 연산자가 다른 상황에서 다르게 작동하는 능력을 나타낸다.
하나의 식별자로 여러 개의 작업을 처리하는 것을 의미한다.
즉 , 프로그램에서 다형성이란 객체들이 똑같은 메세지를 받더라도 각자 실제 타입에 따라서 서로 다른 동작을 하는 것을 말한다.
객체 지향 프로그래밍에서는 주로 오버로딩(Overloading)과 오버라이딩(Overriding)을 통해 구현된다.
2. 캐스팅
업 캐스팅 : 묵시적 형변환 = 부모를 자식에게 대입할 수 없음
- 자식 객체를 부모 참조 변수로 참조하는 것이다.
- 업캐스팅은 묵시적으로 수행 될 수 있다.
- 업캐스팅을 사용하려면 부모의 클래스에 접근 할 수 있다.
- 하지만 자식 클래스에는 접근이 불가능 하다.
다운 캐스팅 : 명시적 형변환
- 부모 객체를 자식 참조 변수로 참조하는 것이다.
- 이것은 묵시적으로 안되고 명시적으로 해야한다.
1) 타입 검사 → 다운 캐스팅 → 실행
수정시 코드가 수정됨 → 위험함
서비스가 되는 것은 검증되서 잘 돌아가는 코드
그 코드를 손되면 망가질 가능성이 있음
runtime escaeption : 실행시 오류
instanceof : 타입 검사
package ex06.example6; class Protoss {} class Zealot extends Protoss { public void attack() { System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss { public void attack() { System.out.println("드라군이 공격합니다."); } } public class CastingEx01 { public static void start(Protoss p) { if(p instanceof Zealot) { Zealot u = (Zealot) p; // 부모를 자식에게 대입할 수 없다. u.attack(); } if(p instanceof Dragoon) { Dragoon u = (Dragoon) p; // 부모를 자식에게 대입할 수 없다. u.attack(); } } public static void main(String[] args) { start(new Zealot()); start(new Dragoon()); } }
2) 오버로딩
수정시 메서드가 늘어남
package ex06.example6; class Protoss {} class Zealot extends Protoss { public void attack() { System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss { public void attack() { System.out.println("드라군이 공격합니다."); } } public class CastingEx01 { public static void start(Zealot u) { u.attack(); } public static void start(Dragoon u) { u.attack(); } public static void main(String[] args) { start(new Zealot()); start(new Dragoon()); } }
3) 동적 바인딩
package ex06.example6; class Protoss { public void attack() {} } class Zealot extends Protoss { public void attack() { System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss { public void attack() { System.out.println("드라군이 공격합니다."); } } public class CastingEx01 { public static void start(Protoss p) { p.attack(); } public static void main(String[] args) { Protoss z = new Zealot(); Protoss d = new Dragoon(); start(z); } }
Share article