도찐개찐
[JAVA] 클래스 형변환 본문
클래스 형변환(Casting)
서로 상속관계에 있는 타입간의 형변환만 가능하다.
자손 타입에서 조상타입으로 형변환하는 경우, 형변환 생략가능
자손타입 → 부모타입 (Up-casting) : 형변환 생략가능
자손타입 ← 부모타입 (Down-casting) : 형변환 생략불가
우선 아래 내용과 같이 클래스 상속 관계를 정의 합니다.
'Car' 라는 부모객체를 상속받고 있는 'FireEngine', 'Ambulance' 객체 형태를 작성해 봤습니다.
class Car {
String color;
int door;
void drive() { // 운전
System.out.println("drive, brooo~");
}
void stop() { // 멈춤
System.out.println("stop!!!");
}
}
class FireEngine extends Car { // 소방차
void water() { // 물
System.out.println("water shot!!!");
}
}
class Ambulance extends Car {
void siren() {
System.out.println("biyong~~~");
}
}
1. 묵시적(암묵적) 형변환
더 큰 그릇(부모 클래스)에 작은 그릇(자식 클래스)의 값을 담는 것을 말합니다.
작은 그릇에서 큰 그릇으로 옮기는 것으로 컴파일러는 에러를 발생시키지 않고 형을 바꿔 줍니다.
class MainClass {
public static void main(String[] args) {
// 묵시적 형변환 케이스
// 자손 > 부모 형 변환 up-casting
// 담는 그릇은 부모 클래스, 참조 인스턴스는 자식 클래스
Car c = new FireEngine();
Car c2 = new Ambulance();
// 에러 발생 케이스
// 부모형으로 선언되어 자식 클래스를 인스턴스 한 경우 자식클래스의 메소드 및 지역변수 사용은 컴파일러 에러가 발생 됩니다.
//c.warter(); // error msg : The method warter() is undefined for the type Car
//c2.siren(); // error msg : The method siren() is undefined for the type Car
}
}
위 소스에서 알수 있듯이 자식 클래스인 FireEngine, Ambulance 클래스를 부모클래스로 인스턴스 시킴으로써 묵시적 형변환이 발생 되는 것을 알 수 있습니다.
- 부모형태로 선언 된 변수에 자식 클래스를 인스턴스 하게 되면 자식 클래스에 선언된 메소드 및 지역변수는 사용이 불가능 합니다.
2. 명시적 형변환
반대로 큰그릇(부모 클래스)에서 작은 그릇(자식 클래스)으로 옮기는 담는 것을 말합니다.
큰 그릇의 값에 따라서 실행시 오류가 발생할수 있습니다. 따라서 컴파일러는 컴파일 시 오류를 발생시키고 명시적으로 형변환을 요구합니다
class MainClass {
public static void main(String[] args) {
// 묵시적 형변환 케이스
// 자손 > 부모 형 변환 up-casting
// 담는 그릇은 부모 클래스, 참조 인스턴스는 자식 클래스
Car c = new FireEngine();
Car c2 = new Ambulance();
// 에러 발생 케이스
// 부모형으로 선언되어 자식 클래스를 인스턴스 한 경우 자식클래스의 메소드 및 지역변수 사용은 컴파일러 에러가 발생 됩니다.
//c.warter(); // error msg : The method warter() is undefined for the type Car
//c2.siren(); // error msg : The method siren() is undefined for the type Car
// 명시적 형변환 케이스
FireEngine f = (FireEngine)c;
//FireEngine f2 = (FireEngine)c2; // 에러발생 Ambulance > Car(O) > FireEngine(X)
f.water();
//f2.water();
}
}
- 부모형태로 선언 된 변수가 다른 자식클래스로 down-casting은 불가능 합니다.
down-casting 가능 : FireEngine f = (FireEngine)c;
down-casting 불가 : FireEngine f2 = (FireEngine)c2;
class MainClass {
public static void main(String[] args) {
FireEngine fireEngine = new FireEngine();
fireEngine.water();
fireEngine.drive(); // 묵시적 형변환
// 명시적 형변환
Car car = (Car)fireEngine; // 자식클래스를 참조한 변수를 형변환 가능
Car car2 = (Car)new Ambulance(); // 자식클래스를 참조함과 동시에 부모형으로 형변환 가능
car.drive();
// 자식형으로 선언된 변수에 부모클래스를 형변환하여 담는것은 에러 발생
FireEngine fireEngine2 = (FireEngine)new Car();
}
}
위 내용을 보면 이미 선언 된 자식형의 변수를 형변환하는 것이 가능 하며 선언과 동시에 형변환 하는 것도 가능 합니다.
부모클래스를 선언함과 동시에 자식형으로 변환하는 것은 불가능 합니다.
728x90
'JAVA' 카테고리의 다른 글
[JAVA] 다형성(polymorphism) (0) | 2022.07.07 |
---|---|
[JAVA] instanceof (0) | 2022.07.07 |
[JAVA] 상속(Inheritance) (0) | 2022.07.06 |
[JAVA] 초기화 블럭(initialization block) (0) | 2022.07.06 |
[JAVA] 클래스변수, 인스턴스변수, 지역변수 (0) | 2022.07.06 |
Comments