본문 바로가기
JAVA/객체지향

자바 강제타입변환(다운케스팅 형변환) 의미, 사용방법

by 스코리아 2023. 9. 6.

안녕하세요, 스코리아입니다.

오늘은 자바의 강제타입변환(다운케스팅 형변환)의 의미와 사용방법에 대해서 알아보겠습니다.

이전 시간에 포스팅한 자바의 자동타입변환에 대해서 모르신다면, 아래의 내용을 꼭 참고해 주시기 바랍니다.

[이전 내용] 자바 자동타입변환(업케스팅 형변환) 알아보기: https://skorea6.tistory.com/22

 

강제 타입변환 의미, 특징?

  • 의미 : 부모 타입을 강제적으로 자식 타입으로 변환 (자동적 X)
  • 조건 : 자식 타입이 부모타입으로 자동 변환된 이후, 다시 자식 타입으로 변환할 때만 가능 (부모 타입으로 생성된 인스턴스를 바로 자식 타입으로 변환하는 것은 불가)
  • 필요한 경우 : 자식 타입이 부모타입으로 자동 변환되면, 부모 타입에 선언된 필드와 메소드만 사용 가능. 이에 자식 타입에 선언된 필드와 메소드를 다시 사용해야 한다면 강제 타입 변환이 필요
  • 자식클래스변수 = (자식클래스) 부모클래스타입
Parent upTest = new Child(); // 묵시적 (업케스팅)
Child downTest = (Child) test; // 명시적 (다운케스팅)

강제 타입변환된 이후

  • 자식 타입에 선언된 필드와 메소드에도 접근 가능

instance of 사용법

  • boolean result = (객체) instance of (타입)로 사용합니다.
  • 예를 들면 parent instance of child이라면, parent 객체가 child 타입인지를 확인합니다.
  • 맞다면 true를 반환하고 틀리면 false를 반환합니다.

강제 타입변환의 예시

이전 시간에 예시로 만들었던 Animal 클래스와 Human, Tiger, Eagle 클래스를 활용하여 강제 타입변환에 대해서 설명하겠습니다.

[이전 내용] "자바의 다형성" 내용 참고하기: https://skorea6.tistory.com/26

class Animal{
    public void move() {
        System.out.println("동물이 움직입니다.");
    }
}

class Human extends Animal{
    @Override
    public void move() {
        System.out.println("사람이 두발로 걷습니다.");
    }

    public void readBooks() {
        System.out.println("사람이 책을 읽습니다.");
    }
}

class Tiger extends Animal{
    @Override
    public void move() {
        System.out.println("호랑이가 네 발로 뜁니다.");
    }

    public void hunting() {
        System.out.println("호랑이가 사냥을 합니다.");
    }
}


class Eagle extends Animal{
    @Override
    public void move() {
        System.out.println("독수리가 하늘을 날아갑니다.");
    }

    public void flying() {
        System.out.println("독수리가 날개를 쭉 펴고 멀리 날아갑니다");
    }
}

public class AnimalTest {
    public static void main(String[] args) {
        Animal hAnimal = new Human();
        Animal tAnimal = new Tiger();
        Animal eAnimal = new Eagle();
        
        ArrayList<Animal> animalList = new ArrayList<>();
        animalList.add(hAnimal);
        animalList.add(tAnimal);
        animalList.add(eAnimal);

        for(Animal animal : animalList) {
            animal.move(); // 다형성이 지켜짐
        }

        System.out.println();
        testDownCasting(animalList); // 다운 캐스팅 (downCasting)
    }

    public static void testDownCasting(ArrayList<Animal> animals) {
        for (Animal animal : animals) {
            if (animal instanceof Human) { // instanceof를 이용하여 인스턴스의 형 체크
                Human human = (Human) animal;
                human.readBooks();
            }else if(animal instanceof Tiger){
                Tiger tiger = (Tiger) animal;
                tiger.hunting();
            }else if(animal instanceof Eagle){
                Eagle eagle = (Eagle) animal;
                eagle.flying();
            }else{
                System.out.println("error");
            }
        }
    }
}

AnimalTest 클래스 안의 testDownCasting 메소드에 대해서 알아보겠습니다.

  • 매개변수로 animal 이름을 가지는 ArrayList를 Animal(부모클래스) 타입으로 넘겨받습니다.
  • ArrayList인 animal을 이용해 향상된 for문으로 돌면서, 자식 타입을 확인해 가며 메소드를 호출해 보도록 하겠습니다.
  • If 문을 사용합니다. 우선 animal이 Human 타입이라면 Human의 readBooks 메소드를 호출하려고 합니다. 여기서 바로 animal.readBook()를 호출하지는 못합니다.
  • 그러므로, "animal instance of Human"을 이용해서 animal이 Human 타입인지 확인 후, animal을 Human으로 강제타입변환 시킨 후 readBook 메소드를 호출하였습니다.
  • 이외에 Triger, Eagle 타입 체크도 마찬가지로 진행했습니다.

자바 강제타입변환 예시 - 실행결과

  • animal 객체를 Human 타입으로 강제타입변환한 human이 사용할 수 있는 메소드는 다음과 같습니다.

강제타입변환 - 가져올 수 있는 메소드

 


지금까지 자바(Java)의 강제타입변환(다운케스팅 형변환)의 의미와 사용방법에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.