[JAVA] 참조변수의 형변환
형변환(Casting)
사용할 수 잇는 멤버의 갯수를 조절하는 것 부모 자식 관계의 참조변수는 서로 형변환 가능
상속관계가 아닌 클래스 간의 형변환 불가
1
2
3
4
5
class Car {}
class Lamborghini extends Car{}
class Ferrari extends Car {}
위의 경우 아래와 같이 부모 자식 관계만 서로 형변환이 가능하다.
flowchart LR
Lamborghini-.->Car(부모)-->Ferrari
Ferrari-.->Car(부모)-->Lamborghini
업캐스팅과 다운캐스팅
부모 객체는 자식 객체에 상속을 받아 상위 요소이다. 이것을 Up 캐스팅이라고 한다.
하지만 반대로 부모 객체가 자식 객체로 형변환하는 것은 Down 캐스팅이라고 한다.
업캐스팅
- 업캐스팅은 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것이다.
- 업캐스팅은 연산자 괄호(캐스팅) 생략이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Car {} // 부모 클래스
class Lamborghini extends Car{} // 자식 클래스
public class Main {
public static void main(String[] args) {
Car up_casting;
Lamborghini l = new Lamborghini();
up_casting = (Car) l;
up_casting = l; // 형변환 생략 가능
}
}
업캐스팅을 하는 이유
- 업캐스팅은 자식 클래스에서 공통적으로 수행해야하는 하나의 인스턴스를 묶어서 관리하기 위해서 업캐스팅을 사용한다.
- 묶어서 관리할 수 있기 때문에 코드량도 줄고 유지보수성이 좋아지기 때문이다.
다운캐스팅
- 다운캐스팅은 업캐스팅의 반대로 부모 클래스의 객체가 자식 클래스 타입으로 형변환 되는 것이다.
- 연산자 괄호(캐스팅) 생략이 불가능하다.
- 다운캐스팅은 업캐스팅 됐던 것을 원상태로 돌리기 위해 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Car {
} // 부모 클래스
class Lamborghini extends Car {
} // 자식 클래스
public class Main {
public static void main(String[] args) {
Car up_casting;
Lamborghini l = new Lamborghini();
up_casting = l;
Lamborghini down_casting = (Lamborghini) up_casting;
// Lamborghini down_casting = up_casting; // 형변환 괄호 생략시 에러
}
}
instanceof 연산자
참조변수 형변환 시 런타임 환경에서 에러가 발생하는 것을 방지할 수 있다.
참조변수의 형변환 가능여부 확인할 때 사용하는 instanceof
연산자를 사용하면 된다.
instanceof
연산자를 사용하여 형변환이 가능하면 true를 반환해준다. 그러므로 형변환을 하기 전 instanceof
연산자를 사용해야한다.
1
2
3
4
5
6
7
8
9
10
11
class Car {} // 부모 클래스
class Lamborghini extends Car{} // 자식 클래스
public class Main {
public static void main(String[] args) {
Lamborghini l = new Lamborghini();
System.out.println(l instanceof Car); // true
System.out.println(l instanceof Lamborghini); //true
}
}
그럼 참조변수의 형변환을 왜 하는 것인가?
참조변수를 변경함으로써 사용할 수 있는 멤버 갯수를 조절하기 위해서 형변환을 사용한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.