날아라쩡글이의 블로그입니다.

형변환 본문

java (학원 전) story

형변환

날아라쩡글이 2021. 8. 3. 12:20
728x90
반응형

형변환(type casting)
형변환이란, 특정데이터타입의 값을 다른 데이터 타입으로 변경해주는 것을 의미한다. 
형변환에는 크게 두가지 종류가 있는데 ,암시적 형변환과 명시적 형변환 총 두 가지가 있다.

 

 


암시적 형변환 (implicit type casting)
암시적 형변환은 더 큰 데이터타입의 공간에 더 작은 데이터타입의 값을 저장할 때 발생이 된다.
예를 들어서 int변수에 byte변수에 저장되어 있는 값을 옮겨담는다고 할 때에는 문제가 발생할 일이 없다.
암시적 형변환은 우리가 추가로 코드를 적지 않아도 자바가 내부적으로 알아서 형변환을 실행시킨다. 

 


명시적 형변환(explicit type casting)
명시적 형변환은 더 작은 데이터타입의 공간에 더 큰 데이터타입의 값을 저장할 때 발생이 된다. 
예를 들어서 byte변수에 int 값을 저장할려고 하면, 자바는 데이터 손실이 발생할 수 있다고 보고, 에러를 발생시킨다. 
이 때, 우리는 자바에게 "데이터 손실이 일어나도 괜찮으니 값을 저장해"라고 지시할 수 있다.
단, 명시적 형변환을 할 때에는 
변수/상수 = (바꿀데이터의 타입)값; 으로 직접 우리가 코드를 적어주어야한다. 
public class Ex02TypeCastiong {
    public static void main(String[]args){
       //byte 변수 myByte를 선언하고 5를 저장해보자 
        byte myByte = 5;
        int myInt = myByte;//int 변수 myInt를 선언하고, myByte의 현재값을 저장하자.
        System.out.println(myInt);
        double myDouble = myInt;
        //변수 myDouble을 선언하고, myInt의 현재값을 저장해보자
        System.out.println(myDouble);
        //위의 경우처럼, 더 큰 데이터타입의 변수에 더 작은 데이터타입의 값을 넣거나 
        //실수 데이터타입의 변수에 정수 데이터타입의 값을 넣을 때에는 데이터 손실이 발생할 가능성이 없으므로
        //암시적 형변환이 발생하여 값의 데이터타입을 자동으로 변환해준다. 
      
        //myByte에 myInt의 현재값을 저장해보자.
        //우리가 볼 때에는 myInt에 저장되어 있는 5를 그대로 myByte에 저장하니깐 
        //에러가 없어야하지만 실제로는 32자리 기준의 5를 8에 담아야 하므로
        //앞의 데이터 (비록 값은 0이지만)들이 손실되기 때문에 
        //암시적 현변환이 발생할 수 없기 때문에 우리가 명시적으로 
        //"int타입인 myInt의 현재값을 byte로 바꿔서 myByte에 저장하라"고 지시해야한다.
        myByte = (byte)myInt;//출력하자
        System.out.println(myByte);
        
        //int 기준으로 0000 0000 0000 0000 0000 0000 0000 0101을
        //byte 기준으로 0000 0101로 손실이 났기 때문에 명시적 형변환을 해준것이다. 
        //myInt에 myDouble의 현재값을 저장해보자
        //위와 마찬가지로 우리가 명시적 형변환을 해주어야 저장할 수 있다. 
        myInt = (int)myDouble;
        System.out.println(myInt);
        //myDouble의 값을 변경하여 저장 후 출력해보자
        myDouble = 4.5;
        myInt = (int)myDouble;
        System.out.println(myInt);
        
        //오버플로우와 언더플로우 
        //오버플로우를 발생시켜봅시다. 
        //myByte에 127을 저장하고 출력, 128을 명시적 형변환해서 저장하고 출력, 129, 300순으로 명시적 형변환 후 저장, 출력
        myByte = 127;
        System.out.println(myByte);
        //에러가 발생하게 된다. byte의 범위를 벗어낫기 때문에 그래도 명시적 형변환(byte)로 그래도 바꿔줘! 하고 요청한다.
        myByte =(byte) 128;//값 -128
        System.out.println(myByte);
        myByte =(byte) 129;//값 -127
        System.out.println(myByte);
        myByte =(byte) 300;//값 44 로 출력이 된다.
        System.out.println(myByte);
        
        //byByte에 -128, -129, -130, -200 -400을 저장하고 출력해보자 
        myByte=(byte)-128;//언더플로우의 값으로 -128의 값이 출력이 되었다. 
        System.out.println(myByte);
        myByte=(byte)-129;//언더플로우의 값으로 127의 값이 출력이 되었다. 
        System.out.println(myByte);
        myByte=(byte)-130;//언더플로우의 값으로 126의 값이 출력이 되었다. 
        System.out.println(myByte);
        myByte=(byte)-200;//언더플로우의 값으로 56의 값이 출력이 되었다. 
        System.out.println(myByte);
        myByte=(byte)-400;//한바퀴 둘러서 112의 값이 출력이 되었다. 
        System.out.println(myByte);
        
        
        
        
        
    }
}

반응형

'java (학원 전) story' 카테고리의 다른 글

java class이름 변경시 (Tip)  (0) 2021.08.03
연산자  (0) 2021.08.03
논리형 데이터 타입  (0) 2021.08.03
데이터 타입(오버플로우, 언더플로우)  (0) 2021.08.02
상수  (0) 2021.08.02
Comments