티스토리 뷰
참조 변수의 타입 변환
기본 자료형과 마찬가지로 참조 변수도 형 변환이 가능하다.
참조 변수의 형 변환은 사용할 수 있는 멤버의 개수 조절을 의미하는데,
자바의 다형성을 이해하는 데 있어 필수적인 개념이라고 할 수 있다.
참조 변수의 타입 변환에는 다음의 세 가지 조건이 필요하다.
- 서로 상속 관계에 있는 상위 - 하위 클래스 사이에서만 가능하다.
- 하위 클래스에서 상위 클래스로의 형 변환(업 스케일링)은 형 변환자(괄호)를 생략할 수 있다.
- 상위 클래스에서 하위 클래스로의 형 변환(다운 스케일링)은 형 변환자(괄호)를 반드시 명시해야 한다.
예시를 통해 조금 더 살펴보자.
public class VehicleTest {
public static void main(String[] args) {
Car car = new Car();
Vehicle vehicle = (Vehicle) car; // 상위 클래스 Vehicle 타입으로 변환(생략 가능)
Car car2 = (Car) vehicle; // 하위 클래스 Car타입으로 변환(생략 불가능)
MotorBike motorBike = (MotorBike) car; // 상속관계가 아니므로 타입 변환 불가 -> 에러발생
}
}
class Vehicle {
String model;
String color;
int wheels;
void startEngine() {
System.out.println("시동 걸기");
}
void accelerate() {
System.out.println("속도 올리기");
}
void brake() {
System.out.println("브레이크!");
}
}
class Car extends Vehicle {
void giveRide() {
System.out.println("다른 사람 태우기");
}
}
class MotorBike extends Vehicle {
void performance() {
System.out.println("묘기 부리기");
}
}
가장 먼저 Vehicle 클래스와 그것을 상속받은 Car, MotorBike 클래스가 있음을 확인할 수 있다.
즉, Vehicle-Car, Vehicle-MotorBike 클래스는 각각 상위-하위 클래스 관계가 있으나 Car-MotorBike는 그렇지 않다.
메인 메서드에서 가장 먼저 Car 타입의 참조변수를 이용해 객체 car를 생성하고,
그 객체를 가리키는 vehicle의 타입을 Vehicle로 선언하여 형 변환을 실행했다(업 스케일링).
이어서 이번엔 vehicle을 하위 클래스 타입인 Car로 변환하여 참조 변수 car2에 할당했다(다운 스케일링).
여기까지는 무리 없이 진행되었으나, 다음 줄을 보면 car 객체를 가리키는 MotorBike 타입의 motorbike를 선언해
형 변환을 시도하는 것을 볼 수 있다.
앞서 언급한 대로 Car 클래스와 MotorBike클래스는 상위-하위 클래스 관계가 아니기 때문에 에러가 나며,
형 변환이 실패하게 된다.
instanceof 연산자
instanceof 연산자는 앞서 살펴본 참조변수의 타입 변환(캐스팅)이 가능한지 여부를 boolean 타입으로 알려주는 연산자다.
캐스팅이 가능한지 판단하기 위해선 두 가지 확인이 필요한데,
- 객체를 어떤 생성자로 만들었는가
- 클래스 사이에 상속관계가 존재하는가
가 그것이다. 이를 확인하기 위해 사용하는 연산자가 instanceof인데, 사용방법은 다음과 같다.
참조_변수 instanceof 타입
위와 같이 입력했을 때 true가 나오면 참조변수가 검사한 타입으로 변환이 가능하며, false일 경우는 불가능하다.
참조 변수가 null인 경우에는 false를 반환한다고 한다.
조금 더 구체적인 예를 보자.
public class InstanceOfExample {
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println(animal instanceof Object); //true
System.out.println(animal instanceof Animal); //true
System.out.println(animal instanceof Bat); //false
Animal cat = new Cat();
System.out.println(cat instanceof Object); //true
System.out.println(cat instanceof Animal); //true
System.out.println(cat instanceof Cat); //true
System.out.println(cat instanceof Bat); //false
}
}
class Animal {};
class Bat extends Animal{};
class Cat extends Animal{};
위 예시를 보면 Animal 클래스와 그 하위 클래스인 Bat와 Cat이 있는 것을 알 수 있다.
그리고 animal과 cat 객체를 생성하여 Animal 타입의 참조 변수에 할당하고, 형 변환 여부를 확인하고 있다.
cat 객체를 예를 들면, 상위 - 하위 클래스 관계와 다형적 표현 방법에 따라 Cat, Animal, Object로
선언될 수 있다는 사실을 확인할 수 있다.
'Java+Spring > Java' 카테고리의 다른 글
[Java]final 키워드, 인터페이스(Interface) (0) | 2022.07.15 |
---|---|
[Java]추상화, abstract 제어자, 추상 클래스 (0) | 2022.07.15 |
[Java]다형성의 활용 예제 (0) | 2022.07.15 |
[Java]다형성(Polymorphism) (0) | 2022.07.15 |
[Java]Getter/Setter 메서드 (0) | 2022.07.15 |
[Java]접근 제어자(Access Modifier) (0) | 2022.07.15 |
- Total
- Today
- Yesterday
- 스프링
- BOJ
- java
- Algorithm
- 알고리즘
- 유럽여행
- 야경
- 세계여행
- 자바
- spring
- 칼이사
- 면접 준비
- 세모
- 파이썬
- 중남미
- a6000
- 여행
- 기술면접
- 백준
- Backjoon
- 세계일주
- 유럽
- 리스트
- 스트림
- 지지
- 동적계획법
- Python
- 맛집
- 남미
- RX100M5
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |