BE/Java

[Java] 캐스팅 (형 변환)

baek-dev 2024. 12. 1. 15:17

1. 기본 자료형 캐스팅

자동 캐스팅

  • 작은 타입에서 큰 타입으로 자동 변환
  • 데이터 손실이 없어서 안전
int a = 10;
double b = a;	// int 가 double 로 자동 변환
System.out.println(b);	// 10.0

강제 캐스팅

  • 큰 타입을 작은 타입으로 변환할때는 데이터 손실 가능성이 있어서 명시적으로 처리해야 한다
  • `(타입)`을 앞에 써서 변환
double a = 10.5;
int b = (int) a;	// double을 int로 강제 변환
System.out.println(b)	// 10 (소수점은 잘림)

 

2. 참조형(객체) 캐스팅

업캐스팅

  • 하위 클래스 객체를 상위 클래스 타입으로 변환
  • 자동으로 수행되며 데이터 손실은 없지만 상위 클래스의 멤버만 접근 가능
class Animal {
    void sound() {
    	System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal {
    void sound() {
    	System.out.println("멍멍");
    }
}

public class Main {
	public static void main(String[] args) {
    	Dog dog = new Dog();
        Animal animal = dog;	// 업캐스팅(자동변환)
        animal.sound();	// "멍멍" 출력
    }
}
  • `animal` 참조변수는 `Animal` 타입이지만 `Dog` 객체를 가리킨다
  • 업캐스팅 후에는 상위클래스(Animal)의 멤버만 사용할 수 있다

다운캐스팅

  • 상위 클래스 객체를 하위 클래스 타입으로 변환
  • 명시적으로 캐스팅 해야하며 틀릴경우 `ClassCastException`이 발생할수있다
class Animal {
    void sound() {
        System.out.println("동물이 소리를 냅니다");
    }
}

class Dog extends Animal {
    void sound() {
        System.out.println("멍멍!");
    }

    void wagTail() {
        System.out.println("꼬리를 흔듭니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();  // 업캐스팅
        Dog dog = (Dog) animal;     // 다운캐스팅 (명시적 변환)
        dog.sound();                // "멍멍!" 출력
        dog.wagTail();              // "꼬리를 흔듭니다." 출력
    }
}
  • 다운캐스팅은 객체가 실제로 해당 타입인지 확인후에 해야한다
  • `instanceof`로 확인 가능
if (animal intanceof Dog) {
    Dod dog = (Dog) animal;
    dog.wagTail();
} else {
	System.out.println("다운캐스팅이 불가능합니다.");
}

요약

  • 기본 타입 캐스팅
    • 자동 : 작은(구체적인) -> 큰(추상적인)
    • 강제 : 큰 -> 작은
  • 참조형 타입 캐스팅
    • 업캐스팅 : 하위 -> 상위 (자동)
    • 다운캐스팅 : 상위 -> 하위 (명시적, 안전확인 필요)

 

 

 

 

출처 : ChatGPT

'BE > Java' 카테고리의 다른 글

[Java] 조건문  (0) 2024.12.01
[Java] 생성자와 오버로딩, getter setter  (0) 2024.12.01
[Java] abstract와 interface  (0) 2024.11.30
[Java] 접근 제어자  (0) 2024.11.30
[Java] static  (0) 2024.11.30