본문 바로가기
컴소니/개발

[다시 시작하는 JAVA 개발] 객체 캐스팅

by 금소니 2022. 5. 26.
반응형

#219

1. 객체 캐스팅이란?

객체의 자료형을 개발자가 원한대는 대로 변경하는 것을 캐스팅이라고 합니다.

가끔 개발을 하다보면 숫자를 문자로 사용하거나 실수를 정수 타입으로 변환하고자 하실 때가 있을겁니다.

이 때 사용하는 것이 캐스팅입니다.

 

2. 캐스팅 예제

이해를 쉽기 위해 캐스팅 예제를 몇개 해보도록 하겠습니다.

 

1) 숫자를 문자로

보시면 ab라는 변수는 숫자형이고 bc는 문자형 변수로 정의되어 있습니다.

따라서 bc에 ab 값을 입력하고자하자 에러가 발생하였습니다.

친절한 이클립스는 여기서 캐스팅을 통하여 해결하라고 합니다.

캐스팅을 해보도록 하겠습니다.

캐스팅(char)을 하니 에러가 사라지고 정상적으로 표현되었습니다.

 

2) 실수형을 정수형으로

여기서 마찬가지로 서로 타입이 다르기 때문에 에러가 발생합니다.

bc는 당연히 정수형이기 때문에 실수형의 데이터를 받을 수 없지요.

하지만 위에서 한 것 처럼 int로 캐스팅을 통해 원하는 값을 넣을 수 있습니다.

하지만 정수형으로 변경하였기 때문에 소숫점은 사라지고 1만 남게 됩니다.

그럼 조금 더 알아보도록 하겠습니다.

3. 캐스팅의 활용

캐스팅에는 업캐스팅과 다운캐스팅이라는게 있습니다.

업캐스팅은 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅 하는 것을 말하고 다운캐스팅은 반대로 범위가 넓은 쪽에서 좁은 쪽으로 캐스팅하는 것을 의미합니다.

 

그럼 어떻게 활용하는지 알아보도록 하겠습니다.

 

1) 업캐스팅

다들 수학을 배워보셨으면 실수가 있고 실수 안에는 유리수와 무리수가 있고 유리수 안에는 정수가 있다는 것을 아실 것입니다.

여기서 실수는 넓은 쪽, 정수는 좁은 쪽에 해당됩니다.

즉, int는 좁은 쪽, double은 넓은 쪽입니다.

그럼 업캐스팅은 int 쪽에서 double 형으로 캐스팅하는 것을 의미합니다.

이렇게 말이죠.

하지만 업캐스팅의 경우 컴파일러가 자동으로 해주기 때문에 따로 캐스팅을 해주지 않아도 됩니다.

생략을 해줘도 에러가 발생하지 않고 정상적으로 동작하게 됩니다.

 

2) 다운캐스팅

하지만 다운캐스팅의 경우에는 다릅니다.

캐스팅할 경우 결과가 달라질 수 있고 예외가 발생할 수 있어 상황에 따라 잘 사용해줘야합니다.

다운캐스팅은 int와 double의 반대를 살펴보시면 됩니다.

보시는 것처럼 반대로 하였을 때는 에러가 발생합니다.

이 때는 캐스팅을 필수로 해줘야합니다.

하지만 캐스팅 후 값은 달라지게 되죠.

따라서 상황에 따라 알고 사용해야지 예상치 못한 결과가 발생하지 않습니다.

 

4. 상속클래스에서 활용

조금 더 심화하여 응용하기 위해 상속클래스에서 알아보도록 하겠습니다.

 

[다시 시작하는 JAVA 개발] 클래스 상속

#217 1. 클래스 상속이란? 다들 상속이라는 개념에 대해서 알고 계시죠? 예를들어 부모가 자식에게 재산을 상속한다는 것처럼 클래스에서도 비슷한 개념을 가지고 있습니다. 자바에는 부모 클래

goldsony.tistory.com

상속 클래스는 지난 포스팅에 이용한 자료를 활용하겠습니다.

 

1) 상속클래스에서 업캐스팅

상속클래스 개념에서 넓은 쪽은 부모클래스가 되고 좁은 쪽은 자식 클래스가 됩니다.

그럼 업캐스팅은 좁은 쪽에서 넓은 쪽을 캐스팅한다고 했으니 자식 클래스 객체 쪽에 캐스팅을 해줘야합니다.

하지만 업캐스팅은 컴파일러가 자동으로 캐스팅을 해주니 따로 캐스팅을 해주지 않아도 되지만 이해를 위해 주석으로 표시하였습니다.

정상적으로 캐스팅되어 부모 클래스의 객체인 p1에 자식 클래스 객체인 s1값을 넣어 활용할 수 있습니다.

하지만 Student 클래스만 가지고 있는 study()라는 메소드는 활용할 수 없네요.

2) 상속클래스에서 다운캐스팅

업캐스팅을 해봤으니 다운캐스팅을 해보도록 하겠습니다.

부모 객체에 다운캐스팅을 하여 자식 객체에 값을 넣어봤는데요.

문법적 오류는 발생하지 않았습니다.

하지만 컴파일을 하고 실행하려고 했을 때 아래와 같이 예외가 발생합니다.

이러한 경우에는 정상적으로 활용이 불가능합니다.

즉, 다운캐스팅이라고 꼭 모두다 활용가능한 것은 아닙니다.

 

이럴 때 캐스팅이 가능한지 불가능한지 확인할 수 있는 방법이 있습니다.

 

3) 캐스팅 가능여부 확인하기

instaneof라는 명령어를 통하여 확인할 수 있습니다.

instancof를 통해 해당 객체가 캐스팅이 가능할 경우 true를 반환하고 불가능할 경우 false를 반환합니다.

그럼 위의 예제에서 캐스팅이 어떠한 경우 가능한지 instanceof를 통해 알아보도록 하겠습니다.

객체가 본인 클래스의 캐스팅의 경우 당연히 가능하므로 생략하였고 부모 클래스와 자식 클래스 간에 캐스팅이 가능한지 알아보기 위해 위와 같이 작성하였습니다.

결과는 아래와 같습니다.

부모 클래스를 자식 클래스로 다운캐스팅하는건 불가능하고 자식 클래스를 부모 클래스로 업캐스팅하는 경우에는 가능하다고 결과가 보여주고 있습니다.

 

이를 활용하여 캐스팅을 어디 방향으로 가능한지 확인하여 예외상황을 벗어날 수 있습니다.

반응형

댓글