본문 바로가기

Java/Java 문법

[Java] 업캐스팅 (UpCasting), 다운캐스팅 (DownCasting)

728x90
반응형

업캐스팅 (UpCasting)

 

부모클래스 타입으로 자식클래스 객체를 호출하는 것을 업캐스팅이라고 한다.

 

업캐스팅을 사용하게 되면 자식클래스를 부모클래스 타입으로 다루게 되기 때문에 부모클래스의 멤버와 메서드에만

접근이 가능하다.

 

아래 코드처럼 작성하면 a, b 인스턴스는 overriding을 사용한 Print 메서드를 호출하지만 Number 타입을 사용할 수 있다.

 

class Number {
    public int i, j;
    public void Print() {
        System.out.println(i);
        System.out.println(j);
    }
}

class Plus extends Number {
    @Override
    public void Print() {
        System.out.println(i+j);
    }
}
class Mul extends Number {
    @Override
    public void Print() {
        System.out.println(i*j);
    }
}

public class Example {
    public static void main(String [] args) {
        Number a = new Plus();
        a.i = 10;
        a.j = 15;
        Number b = new Mul();
        b.i = 10;
        b.j = 15;
        a.Print();
        b.Print();
    }
}

 

 

 

 

다운캐스팅 (DownCasting)

 

다운캐스팅은 업캐스팅과 달리 캐스팅 연산자 ()를 사용하여 명시해주어야 한다.

 

다운캐스팅을 사용하면 자식 클래스의 타입으로 변환되면서 업캐스팅 시 사용하지 못하게 되었던 자식 클래스의 멤버와 메서드에 접근할 수 있게 된다.

 

따라서 다운캐스팅은 필연적으로 업캐스팅 이후에만 사용된다.

 

만약 업캐스팅되지 않은 일반적인 부모클래스 타입의 객체를 다운캐스팅하려고 하면 ClassCastException 런타임 에러가 발생한다.

 

class Number {
    public int i, j;
    public void Print() {
        System.out.println(i);
        System.out.println(j);
    }
}

class Plus extends Number {
    @Override
    public void Print() {
        System.out.println(i+j);
    }
    public void CalculatePrint() {
        System.out.println("i + j : " + i+j);
    }
}
class Mul extends Number {
    @Override
    public void Print() {
        System.out.println(i*j);
    }
    public void CalculatePrint() {
        System.out.println("i * j : " + i*j);
    }
}

public class Example {
    public static void main(String [] args) {
        Number a = new Plus();
        a.i = 10;
        a.j = 15;
        Number b = new Mul();
        b.i = 10;
        b.j = 15;
        a.Print();
        b.Print();
        Plus aPlus = (Plus)a;
        Mul bMul = (Mul)b;
        aPlus.CalculatePrint();
        bMul.CalculatePrint();
    }
}

 

위 코드에서 a와 b를 aPlus와 bMul에 다운캐스팅한 후 CalculatePrint() 메서드를 출력할 수 있게 된 것을 확인할 수 있다.

 

 

 

 

* UpCasting과 DownCasting 기능을 통해서 코드를 더 일관적으로 작성할 수 있게 되고 Java 언어는 다형성을 갖게 된다.

 

 

 

728x90
반응형