Tiny Star

🪄Interview/✏️Study

[CS STUDY INTERVIEW] 6주차 - 캐스팅 (Casting)

청크 2024. 3. 25. 11:54

CS 스터디 6주차 

 

자바에서의 캐스팅(Casting)


캐스팅이란

 

형변환을 의미하며 어떤 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 의미하며,

데이터 타입이 다를 경우 서로 호환되지 않기 때문에 이런 경우에 데이터 타입을 맞춰서 로직을 처리하거나 저장할 때 유용하다.

 

캐스팅에는 크게 업캐스팅과 다운캐스팅.  두 가지의 유형이 존재한다.


캐스팅의 종류

1. 업캐스팅(암시적 캐스팅 - Implicit Casting)

작은 데이터 타입의 값은 큰 데이터 타입으로 데이터 손실이 없을 경우에 자동으로 변환되는데,

이 때 발생하는 것이 업캐스팅이다.

 

예를 들어 int를 double로 변환하거나 float를 double로 변환하는 것이 업캐스팅의 예라고 할 수 있다.

int x = 10;
double y = x; // 암시적 캐스팅 발생

 

2. 다운캐스팅(명시적 캐스팅 - Explicit Casting)

다운캐스팅은 업캐스팅과 반대로 큰 데이터 타입을 작은 데이터 타입으로 변환할 때 사용된다.

 

이는 데이터 손실이 발생할 수 있으므로 명시적으로 캐스팅을 해야하는데,

명시적 캐스팅은 캐스트 연산자인 '(type)'을 사용해서 수행할 수 있다.

double y = 10.5;
int x = (int) y; // 명시적 캐스팅 발생

참조형과 캐스팅

 

앞서 정리한 내용은 기본적으로 사용하는 기본형 타입의 형변환이지만 참조형 데이터 타입도 존재한다.

 

자바에서 참조형에 대한 형변환은 객체 간의 상속 관계에 따라 이루어지는데,

부모-자식 클래스 간의 형변환이 가능하다.

 

1. 업캐스팅(Upcasting )

부모 클래스 타입으로 자식 클래스의 객체를 참조할 수 있는 것으로

 이 역시 암시적으로 이루어지며, 부모 클래스 타입으로 자식 클래스의 특성을 일반화하여 다룰 수 있다.

ParentClass parent = new ChildClass();

 

2. 다운캐스팅(Downcasting)

부모 클래스로부터 자식 클래스로 형변환 하는 것으로, 다운 캐스팅은 명시적으로 캐스팅 연산자를 사용해야한다.

만약 캐스팅 연사자를 사용하지 않을 경우 컴파일러에서 오류가 생기지 않더라도 런타임 시 

해당 객체가 실제로 그 클래스의 인스턴스인지를 검사하기 때문에 만약 다운캐스팅이 불가능한 경우애는 ClassCastException이 발생할 수 있다.

ChildClass child = (ChildClass) parent;

 

다운캐스팅은 주로 업캐스팅된 객체를 원래 자식 클래스 타입으로 되돌리고 해당 클래스에 정의된 메서드나

속성에 접근하기 위해 사용되지만 남용 시에는 코드의 유연성 감소, 오류 발생 등의 부작용이 존재하기 때문에 유의해야한다.

 

또한 형변환은 객체 간의 상속 관계에 근거하기 때문에 상속 관계가 아닌 클래스나 인터페이스 사이에는 형변환이 불가능 하다는 점도 알아두어야 한다.


캐스팅을 수행하는 이유

1) 데이터 타입 호환성: 서로 다른 데이터 타입 간에 연산이나 대입을 하기 위해서는 데이터 타입을 일치시켜야하는데,

캐스팅을 사용하여 데이터 타입을 변환하여 호환성을 확보할 수 있다.

2) 정확도 조정: 계산 결과가 원하는 형식으로 나오도록 데이터 타입을 조정할 수 있는데,

예를 들어, 부동 소수점 연산 결과를 정수로 변환하여 정확한 값을 얻을 수 있다.

3) 메소드 호출: 다형성과 관련하여 부모 클래스 타입의 객체를 자식 클래스 타입으로 변환하여 특정 메소드를 호출하는 경우가 있는데,

이를 위해서도 캐스팅이 사용된다.

4) 라이브러리 호환성: 외부 라이브러리나 API에서 반환하는 값의 타입이 우리가 필요한 형태와 일치하지 않을 수 있다.

이 경우 캐스팅을 사용하여 데이터를 우리가 원하는 형식으로 변환할 수 있다.


면접 예상 질문과 답변

Q1. 캐스팅(Casting)이란?
A1. 캐스팅은 데이터 타입을 다른 데이터 타입으로 변환하는 과정을 의미합니다. 서로 다른 데이터 타입 간에 호환성이 없을 때, 데이터 타입을 맞춰주는 작업으로 이해할 수 있습니다.

 

Q2. 캐스팅에는 어떤 종류가 있으며, 각각 어떤 상황에서 사용되는가?
A2. 캐스팅에는 업캐스팅(암시적 캐스팅)과 다운캐스팅(명시적 캐스팅)이 있습니다. 

업캐스팅은 작은 데이터 타입을 큰 데이터 타입으로 변환할 때 발생하며, 

다운캐스팅은 큰 데이터 타입을 작은 데이터 타입으로 변환할 때 사용됩니다. 

업캐스팅은 데이터 손실이 없는 경우 자동으로 이루어지고, 다운캐스팅은 명시적으로 캐스팅 연산자를 사용하여 수행됩니다.

 

Q3. 캐스팅은 왜 필요한가?
A3. 캐스팅은 여러 가지 이유로 필요합니다. 

데이터 타입 호환성을 확보하거나, 원하는 형식의 데이터를 얻고 다형성을 활용하여 부모 클래스 타입의 객체를 

자식 클래스 타입으로 변환하여 특정 메소드를 호출하기 위해 사용될 수도 있습니다. 

또한, 외부 라이브러리나 API에서 반환하는 값의 타입이 필요한 형태와 일치하지 않을 때, 

캐스팅을 사용하여 데이터를 원하는 형식으로 변환할 수 있습니다.

 

Q4. 캐스팅의 주된 용도?
A4. 캐스팅의 주된 용도는 데이터 타입을 변환하여 호환성을 확보하고, 

정확한 계산 결과를 얻거나 메소드를 호출하는 등 프로그램의 유연성을 높이는 데에 있습니다.

 

Q5. 다운캐스팅을 할 때 주의해야 할 점
A5. 다운캐스팅을 할 때에는 명시적 캐스팅 연산자를 사용해야 하며, 

런타임 시에 ClassCastException이 발생할 수 있는 가능성이 있으므로 

이를 방지하기 위해 instanceof 연산자로 해당 객체가 캐스팅 가능한지 확인하는 것이 중요합니다.

 

Q6. 캐스팅은 객체 간의 어떤 관계에 근거하는가?
A6.  캐스팅은 객체 간의 상속 관계에 근거하여 이루어집니다. 

부모 클래스와 자식 클래스 간에는 업캐스팅과 다운캐스팅이 가능하며, 

업캐스팅은 암시적으로 이루어지지만 다운캐스팅은 명시적으로 캐스팅 연산자를 사용하여 이루어집니다.