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