본문 바로가기
✨ Java/etc

자바(JAVA) - 자료의 형 변환(자료형) 업캐스팅, 다운캐스팅

by 환풍 2023. 7. 9.
728x90
반응형

형 변환 ( Type Casting ) 이란?

 변수의 타입을 다른 타입으로 변환하는 것이다.

ex) char <---> int

  • 기본자료형은 기본자료형끼리, 참조 자료형은 참조 자료형끼리 형 변환이 가능하다.
  • boolean은 다른 기본 타입과 호환되지 않는다.
  • 기본타입과 참조형의 형 변환을 위해 Wrapper 클래스를 사용할 수 있다.

 

프로모션(promotion) - 더 큰 자료형으로의 자동 변환 / 정보의 손실이 없다. 자동형변환(묵시적)

이것을 업 캐스팅(UpCasting)이라고 부른다.

자동형변환(묵시적)은 자료의 손실 걱정이 없어 JVM이 서비스 해준다.

 

 

 

디모션(demotion) - 더 작은 자료형으로의 변환(명시) / 정보의 손실이 발생할 가능성이 있다. 강제형변환(명시적)

이것을 다운 캐스팅(DownCasting) 이라고 부른다.

강제형변환(명시적)은 값 손실이 발생할 수 있어 프로그래머 책임하에 형변환한다.

 

 

기본자료형(Primitve type) -> 값을 가지고 있는 변수 *스택 statck 메모리에 저장

참조자료형(Reference type) -> 주소를 가지고 있는 변수 *힙 Heap 메모리에 저장

 

참조형(Reference type)은 배열타입, 열거 타입, 클래스 , 인터페이스

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package zon;
 
public class Change {
 
    public static void main(String[] args) {
        int a = 960612;
        
        //실수 인트로 형변환
        float b = (float)a;
        int intB = (int)b;
        
        double c = (double)a;
        int intC = (int)c;
        
        System.out.println(a);
        System.out.println(b);
        System.out.println(intB);
        System.out.println(c);
        System.out.println(intC);
        
        //문자열 정수로 형변환
        int d = Integer.parseInt("100");
        System.out.println(d);
        
        for(int i='a';  i<='z'; i++) {
            System.out.printf("%c=%d\t", (char)i,i);
        }
    }
 
}
 
cs

 


 

컴파일 에러

위 사진을 보면 산술 연산을 하려고하는데, 컴파일 에러가 나는 것을 확인해볼 수 있다.

 

1.  자바에서 산술 연산을 수행할 때 기본적으로 int형으로 처리되기 때문이다.
따라서 b1과 b2의 덧셈 연산 결과는 int형으로 처리되고, 이 값을 byte형 변수 b3에 저장하려하니 오류가 난다.
자바에서는 작은 정수 데이터 타입인 byte, short, char가 산술 연산을 수행할 때 자동으로 int로 변환된다.
int는 byte보다 더 큰 범위를 가지므로 데이터 손실우려가 있기 때문에 이를 해결하기 위해 b1과 b2를 더한 결과를 byte로 명시적 형변환 해주어야한다. 단, byte범위 -128 ~ 127를 초과할 경우도 주의해야한다.

2. 자바에서 산술 연산을 수행할 때 작은 데이터 타입에서 큰 데이터 타입으로 자동 형변환이 이뤄지지만, 
큰 데이터 타입에서 작은 데이터 타입으로 자동 형변환은 일어나지 않는다.
여기서 int와 long은 각각 4byte, 8byte로 long이 더 큰 데이터 타입을 가진다. 따라서 int와 long을 더하면  결과는 long 데이터 타입으로 자동 형변환이 되지만, 이를 다시 int로 할당하려 하면 컴파일러는 데이터 손실우려 때문에 오류가 난다.
따라서 두가지 방법이 있다. i1을 long으로 형변환하거나, i2를 long으로 선언하면 된다.

3. 자바에서 실수 연산을 수행할 때 기본적으로 double 형으로 처리된다. 
따라서 f1과 20.0의 덧셈 결과는 double형으로 처리되고, 이 값을 float 형 변수 f2에 저장하려하면 오류가 난다.
작은 실수 데이터 타입인 float가 큰 실수 데이터 타입인 double로 자동형변환이 되지만, 큰 데이터 타입인 double을 작은 데이터 타입인 float로 자동 형변환하려 할 때, 컴파일러가 데이터 손실우려때문에 오류가 난다.
따라서 두가지 방법이 있다. f1을 double로 형변환하거나, f2를 double로 선언하면 된다.
728x90
반응형

댓글