충분히 쌓여가는
참조변수의 형변환 본문
참조변수의 형변환
사용할 수 있는 멤버의 갯수를 조절하는 것
기본 형변환과 다르다[3.4 (int)-> 3]
조상 자손 관계의 참조변수는 서로 형변환 가능
class Car {
String color;
int door;
void drive() {
System.out.println("drive");
}
void stop() {
System.out.println("stop");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water");
}
}
형변환을 따지기 전에 일단 형변환을 하고 나서 생각하자
타입이 안맞으면 형변환 사용해서 맞춰주면된다
일단 조상 자손 관계만 참조변수가 형변환 가능하다는 것을 염두하고 코드를 작성하자
참조변수 f는 멤버 5개 모두 사용 가능하지만,
참조변수 c는 본래 자신이 가지고 있던 멤버 4개만 사용가능하다
코드
class Car {
String color;
int door;
void drive() {
System.out.println("drive");
}
void stop() {
System.out.println("stop");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water");
}
}
public class typeChange {
public static void main(String[] args) {
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe; // car = (Car)fe;에서 형변환 생략됨(5개 => 4개)
// car.water(); // 에러
fe2 = (FireEngine)car; // 조상타입 -> 자손 타입, 형변환 필수(4개 => 5개)
fe2.water();
}
}
water
water
형변환 실행 에러
컴파일은 실행되지만 형변환 실행에러가 발생한다
객체가 Car 인스턴스이고, FireEngine로 형변환을 해도 water()는 만들어진 객체에 없기 때문에 에러가 발생한다
여기서 형변환만 맞으면 컴파일러는 에러없이 지나가기 때문에 주의해야한다
(FireEngine에는 water()가 있지만 생성된 객체는 Car로 만들어진 객체이기 때문에 water()이 없다)
참조변수간의 형변환보다 실제 가리키는 객체가 중요하다
class Car {
String color;
int door;
void drive() {
System.out.println("drive");
}
void stop() {
System.out.println("stop");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water");
}
}
public class typeChange {
public static void main(String[] args) {
Car c = new Car();
FireEngine fe = (FireEngine)c; // 형변환 실행 에러
fe.water(); // 컴파일 실행됨
}
}
'Java > 객체지향' 카테고리의 다른 글
매개변수의 다형성(다형성 장점 1) (0) | 2023.06.13 |
---|---|
instanceof 연산자 (0) | 2023.06.12 |
다형성(polymorphism) (0) | 2023.06.12 |
캡슐화 (0) | 2023.06.09 |
접근 제어자(access modifier) (0) | 2023.06.09 |