JAVA_Polymorphism

뚱이아저씨·2023년 3월 10일
0

자바

목록 보기
11/15
post-thumbnail

다형성(Polymorphism)

  • 업캐스팅, 다운캐스팅 되는 것을 의미 한다.
  • 하나의 코드(객체)가 여러 타입으로 구현되어 실행되는 것을 의미 한다.
  • 같은 코드에서 여러 다른 실행 결과가 나온다.
  • 정보은닉, 상속과 더불어 객체 지향 프로그램의 가장 큰 특징 중 하나이다.

자바의 참조형 캐스팅

캐스팅이란 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환(캐스팅)이라고 한다.

자바의 데이터형을 알아보면 크게 두가지로 나뉜다.
1. 기본형(primitive type) -> Boolean Type(boolean) -> Numberic Type(short,int,long,float,double,char)
2. 참조형(reference Type) -> Class Type -> Interface Type-> Array Type -> Enum Type -> 그 외 다른 것들

자바의 상속관계(extends, implements)에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능하다.

자바 클래스의 객체는 부모 클래스를 상속하고 있기때문에 부모의 멤버를 모두 가지고 있다.
반면, 부모 클래스의 객체는 자식 클래스의 멤버를 모두 가지고 있지 않는다.
즉, 참조변수의 형변환은 사용할 수 있는 멤버의 개수를 조절하는 것이다.

출력 예시

class Parent {
	String name;
    int age;
}

//Parent(부모)클래스를 Child클래스로 상속 받는다.
class Child extends Parent {
	int number;
}

//객체 생성
Parent p = new Parent();
Child c = new Child();

Parent p2 = (Parent) c; //업캐스팅-자식에서 부모로
Child c2 = (Child) p; //다운캐스팅-부모에서 자식으로

업캐스팅(Up_Casting)

  • 업캐스팅은 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것이다.
  • 업캐스팅은 캐스팅 연산자 괄호를 생략할 수 있다.
  • 단, 부모클래스로 캐스팅 된다는 것은 멤버의 개수 감소를 의미 한다.
    이는 곧 자식 클래스에서만 있는 속성과 메서드는 실행하지 못한다는 뜻이다.
  • 업캐스팅을 하고 메소드를 실행 할때, 만일 자식 클래스에서 오버라이딩한 메소드가 있을 경우, 부모 클래스의 메소드가 아닌 오버라이딩된 메소드가 실행되게 한다.

업캐스팅을 하는 이유

업캐스팅을 사용하는 이유는 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서 이다.

다운 캐스팅(Down_Casting)

  • 다운 캐스팅은 거꾸로 부모클래스가 자식클래스 타입으로 캐스팅 되는 것이다.
  • 다운 캐스팅은 캐스팅 연산자 괄호를 생략할 수 없다.
  • 다운 캐스팅의 목적은 업캐스팅한 객체를 다시 자식 클래스 타입의 객체로 되돌리는데 목적을 둔다.

출력 예시

class Unit {
	public void attak() {
    	System.out.println("유닛 공격");
    }
}

class Zealot extends Unit {
	@Overrid
    public void attack() {
    	System.out.println("찌르기")
    }
    public void teleportation() {
    	System.out.println("프로토스 워프"); 
    }
}

public class Main {
	public static void main(String[] args) {
    	//변수 생성
        Unit unit_up;
        //Zealot 객체 생성
        Zealot zealot = new Zealot();
        
        //업캐스팅
        unit_up = zealot;
        
        //다운캐스팅 : 자식 전용 멤버를 이용하기 위해 , 이미 업캐스팅한 객체를 되돌릴때 사용
        Zealot unit_down = (Zealot) unit_up;
        unit_down.attack(); 
        unit_down.teleportation();
    }
}

설명 : 업캐스팅된 객체 unit_up에서 만일 자식 클래스에만 있는 teleportation()메서드를 실행해야 하는 상황이 온다면, 다운 캐스팅을 통해 자식 클래스 타입으로 회귀 시킨뒤 메서드를 실행하면 된다.

다운 캐스팅 주의점

  • 다운 캐스팅의 목적은 업캐스팅한 객체를 되돌리는데 있다.
  • 업캐스팅되지 않은 부모 객체일 경우, 다운 캐스팅하면 오류가 발생하게 된다.
profile
뚱이아빠의 개발자도전기

0개의 댓글