날아라쩡글이의 블로그입니다.
형변환 본문
형변환(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 |