안녕하세요, 스코리아입니다.
오늘은 자바의 강제타입변환(다운케스팅 형변환)의 의미와 사용방법에 대해서 알아보겠습니다.
이전 시간에 포스팅한 자바의 자동타입변환에 대해서 모르신다면, 아래의 내용을 꼭 참고해 주시기 바랍니다.
[이전 내용] 자바 자동타입변환(업케스팅 형변환) 알아보기: 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)의 강제타입변환(다운케스팅 형변환)의 의미와 사용방법에 대해서 알아보았습니다.
읽어주셔서, 감사합니다.
'JAVA > 객체지향' 카테고리의 다른 글
자바 인터페이스 의미, 특징, 선언, 구현 방법 (interface) (1) | 2023.09.21 |
---|---|
자바 추상클래스 의미, 구현 방법 (abstract class) (2) | 2023.09.08 |
자바 다형성 의미, 사용방법 (feat.객체지향) (1) | 2023.09.02 |
자바 메소드 재정의 의미, 사용방법 (@Override) (2) | 2023.08.31 |
자바 자동타입변환(업케스팅 형변환) 의미, 사용 방법 (2) | 2023.08.29 |