카테고리 없음

자바 변수 기본 예제7- 타입 캐스팅, 자동 캐스팅과 강제 캐스팅

자바칩 프라푸치노 2020. 9. 8. 07:47

안녕하세요 자바칩 프라푸치노입니다.

오늘은 타입 형변환에 대해 실습해보겠습니다.

 

1. 자동 캐스팅

2. 강제 캐스팅

3. 강제 캐스팅 - 루핑, 데이터 손실

 

이론은 이 글을 보고 와주세요

2020/09/01 - [§개발자 되기 프로젝트§/java 이론] - [자바JAVA] 변수2 - 변수의크기, 명명규칙, 문자열, 형변환, 오버플로우

 

[자바JAVA] 변수2 - 변수의크기, 명명규칙, 문자열, 형변환, 오버플로우

안녕하세요 자바칩 프라푸치노입니다. 오늘도 자바 공부를 해봅시다! 오늘은 변수에 대해서 알아보는 두번째 시간입니다. (*본 게시물은 모바일 환경보다 PC환경에서 가독성이 좋습니다) **첫번�

sso-feeling.tistory.com

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sec01_exam;
 
public class CastingEx1 {
 
    public static void main(String[] args) {
        
        
        int i = 100;// 4바이트
        char ch1 = 'a';//2바이트
        
        int j = ch1;// 자동 캐스팅: 2바이트 -> 4바이트
        char ch2 = (char)j;// 강제 캐스팅: 4바이트 -> 2바이트
    
    }
 
}
 
cs

이렇게 변수를 선언과 초기화 해주겠습니다.

int타입은 4바이트, char타입은 2바이트 크기입니다.

 

int j 는 char 형인 ch1 으로 초기화를 했네요.

대입 연산자는 오른쪽에서 왼쪽으로 값이 대입되죠.

그러면 2바이트인 ch1이 int형이 된다 이말이겠네요.

그러면 2바이트가 4바이트가 되는거니 자동캐스팅이 되겠습니다.

 

밑에를 보시면 char형인 ch2에 

int형인 j를 대입한다고 되어있습니다.

그러면 4바이트가 2바이트로 되는거니까 강제 캐스팅이겠죠.

강제 캐스팅은 ()안에 변환하려는 타입을 적어주시면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package sec01_exam;
 
public class CastingEx1 {
 
    public static void main(String[] args) {
        
        
        int i = 100;// 4바이트
        char ch1 = 'a';//2바이트
        
        int j = ch1;// 자동 캐스팅: 2바이트 -> 4바이트
        char ch2 = (char)j;// 강제 캐스팅: 4바이트 -> 2바이트
 
        System.out.println("i의 값: " + i);
        System.out.println("ch의 값: " + ch1);
        System.out.println("j의 값: " + j);
        System.out.println("j의 값: " + (char)j);
        System.out.println("ch의 값: " + ch2);
    
    }
 
}
 
cs

그러면 이렇게 출력을 해봅시다.

어떻게 나올지 먼저 예상을 해볼까요?

 

먼저 i는 그대로 100이 나오겠네요

ch1도 그대로 a가 나오겠습니다.

j는 ch1이 int타입으로 변환된 값이 나올테니 a의 아스키코드의 값 97이 나오겠군요.

그런 j를 다시 char형으로 강제 캐스팅 한 것은 a가 나오겠구요

ch2도 j를 강제 캐스팅했으니 a가 나오겠네요.

확인해볼까요?

맞네요!

이렇게 쉽게 캐스팅을 배워보았습니다.

여기에서는 강제캐스팅을 해도 데이터 손실이 일어나지 않았는데요,

데이터 손실이 일어난다면 어떻게 될지 한 번 살펴봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec01_exam;
 
public class CastingEx1 {
 
    public static void main(String[] args) {
        
        
        byte a = (byte)128;// 강제 캐스팅        
        System.out.println("a의 값: " + a );//루핑    
 
    }
 
}
 
cs

byte 는 -128~ 127까지 저장이 가능한 크기라고 말씀드렸습니다.

그런데 128이 들어갔고, byte로 강제 캐스팅이 들어갔죠.

그러면 루핑을 돌아서 전혀 다른값이 나옵니다.

확인해보죠.

이렇게 나왔네요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package sec01_exam;
 
public class CastingEx1 {
 
    public static void main(String[] args) {
        
        
        byte a = 1;        
        byte b = (byte)128;
        System.out.println("b의 값: " + b);
        
        //b = (byte)200 + a; => 에러. 
        b = (byte)(200 + a); // 강제 캐스팅
        
        System.out.println("b의 값: " + b);
    }
 
}
 
cs

이번에는 이렇게 쳐봤습니다.

b는 아까의 a와 마찬가지로 128을 byte로 강제캐스팅했고,

b에 또다시 200+a 한 값을 넣어서 byte로 강제캐스팅 하고 있네요.

연산한값을 강제 캐스팅하려면 괄호를 치고 전체 캐스팅을 해주어야합니다.

확인해볼까요?

원하는 값과 전혀 다른 값이 나왔죠.

이렇게 데이터 손실을 초래하는 타입 캐스팅은 굉장히 위험한 것이라고 할 수 있겠습니다.

오늘은 이렇게 형변환에 대해서 알아보았습니다.

수고많으셨습니다 ^__^

728x90