인프런 커뮤니티 질문&답변

hoje님의 프로필 이미지
hoje

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

형 변환 (전반전)

형변환과 업캐스팅/다운캐스팅

작성

·

414

·

수정됨

1

 정수형에서 실수형으로

// int > long > float > double (정밀한 데이터 = 자동 형변환)

실수형에서 정수형으로

// double > float > long > int (큰 -> 작은 = 수동 형변환)

 

데이터 단위 형변환은 업캐스팅/다운캐스팅과 관련이 없는 개념인거죠? 뒤에까지 듣고 앞을 다시 듣다보니 int는 작은녀석이고, double은 큰범위의 녀석이니 형변환이 필요한거 아닌가? (반대는 큰녀석을 작은녀석으로 형변환 하니 자동으로 된다)

하고 의문이 들어서요

 

업캐스팅/다운캐스팅은 클래스, 메소드가 있는 상황에서 발생하는거죠?

 

 

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

먼저 자바의 데이터 타입에는 기본 자료형(int, double 등)과 참조 자료형(String 등)이 있습니다. 이들은 형변환이 가능한데 기본 자료형은 boolean 을 제외한 자료형 즉 int 를 double 로, 또는 double 을 int 로 변환하는 등의 작업이 가능하며, 참조 자료형은 상속관계에 있는 클래스 사이에 자식 클래스 객체를 부모 클래스 타입으로 (업캐스팅), 부모 클래스 객체를 자식 클래스 타입으로 (다운캐스팅) 형변환이 가능합니다. 기본 자료형과 참조 자료형간의 형변환은 불가능합니다.

자바에서는 자동 형변환과 수동 형변환 두 가지가 있는데요.

(1) 자동 형변환 (묵시적 형변환)

자동 형변환은 작은 데이터 타입을 큰 데이터 타입으로 변환할 때 발생합니다. 예를 들어, int를 double로 변환하면 자동으로 형변환이 이루어집니다. 이는 데이터의 손실 없이 변환이 가능하기 때문에 자동으로 수행됩니다.

int num = 10;
double result = num; // int를 double로 자동 형변환

(2) 수동 형변환 (명시적 형변환)

수동 형변환은 큰 데이터 타입을 작은 데이터 타입으로 변환하거나, 다른 데이터 타입으로 변환할 때 사용됩니다. 이 경우에는 명시적으로 변환해야 하며, 데이터의 손실이 발생할 수 있기 때문에 개발자가 직접 형변환을 지정해야 합니다.

double num = 3.14;
int result = (int) num; // double을 int로 수동 형변환

업캐스팅과 다운캐스팅은 앞서 말씀드렸듯 클래스의 상속 관계와 관련된 개념입니다.

예시로 물건을 나타내는 클래스인 Item과 그 중에서도 책을 나타내는 클래스인 Book을 가지고 설명해볼까요?

// Item 클래스
public class Item {
    private String name;
    private int price;
    ...
}

// Book 클래스 (Item 클래스를 상속)
public class Book extends Item {
    private String author;
    private String genre;
    ...
}

이때 업캐스팅과 다운캐스팅은 다음과 같이 사용할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        // 업캐스팅 (자동 형변환)
        Item item = new Book(); // Book 객체를 Item 타입으로 업캐스팅
        // 다운캐스팅 (수동 형변환)
        Item item2 = new Book();
        Book book = (Book) item2; // Item 객체를 Book 타입으로 다운캐스팅

        // 주의 : 다운캐스팅할 때 원래의 타입이 맞지 않으면 ClassCastException 발생 가능
        // 예를 들어, 아래와 같은 경우는 컴파일 에러는 없지만 
        //실행 시 ClassCastException이 발생할 수 있습니다.

        // Item item3 = new Item();
        // Book book2 = (Book) item3;
    }
}

이 예제에서 Item 클래스는 물건을 나타내는 기본 클래스이고, Book 클래스는 책을 나타내는 클래스입니다. Book 클래스는 Item 클래스를 상속받기 때문에 Book 클래스는 Item 클래스의 하위(자식) 클래스입니다. 그러므로 Book 객체는 Item 타입으로 업캐스팅이 가능합니다. 즉, Item item = new Book();와 같이 Book 객체를 Item 타입으로 변환할 수 있습니다.

반대로, Item 객체를 Book 타입으로 변환하려면 명시적인 형변환이 필요합니다. 즉, Item item2 = new Book();와 같이 Item 객체를 Book 타입으로 변환하려면 (Book) item2와 같이 명시적으로 형변환을 해야 합니다. 이것이 다운캐스팅입니다.

정리하면, 형변환은 기본 자료형 또는 참조 자료형 내에서 다른 형태(타입)로 변환하는 것을 말하며, 업캐스팅과 다운캐스팅은 클래스 간의 상속 관계에서 부모 클래스 또는 자식 클래스로 변환하는 것을 말합니다.

궁금증 해결에 도움되었으면 합니다 😊
감사합니다.

hoje님의 프로필 이미지
hoje
질문자

답변 감사합니다

감사합니다. 덕분에 업캐스팅/다운캐스팅 간단히 복습하였습니다 :)

hoje님의 프로필 이미지
hoje

작성한 질문수

질문하기