포스트

[JAVA] 참조변수의 형변환

형변환(Casting)

사용할 수 잇는 멤버의 갯수를 조절하는 것 부모 자식 관계의 참조변수는 서로 형변환 가능

상속관계가 아닌 클래스 간의 형변환 불가

1
2
3
4
5
class Car {}

class Lamborghini extends Car{}

class Ferrari extends Car {}

위의 경우 아래와 같이 부모 자식 관계만 서로 형변환이 가능하다.

flowchart LR
Lamborghini-.->Car&#40부모&#41-->Ferrari
Ferrari-.->Car&#40부모&#41-->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 라이센스를 따릅니다.