타입 변환이란 데이터 타입을 다른 데이터타입으로 변환하는 과정을 말한다.
long 타입을 int 타입으로 변환시킨다.
int 타입을 long 타입으로 변환시킨다.
등등 ..
타입 변환에는 자동타입변환과 강제타입변환이 있다.
자동타입 변환이란 말 그대로 프로그램 실행중 자동타입 변환이 일어나는 데 작은 크기의 타입이 큰 크기를 가지는 타입을 저장할 때 발생한다.
이를 알기 위해선 우선 타입별 크기를 알아야 한다.
byte(1) | short(2) | int(4) | long(8) | double(8) |
여기서 주의할 점이 있다.
float(4)은 4byte 크기이지만 표현 범위가 long보다 크다.
바로 한번 타입 변환을 해보자.
책으로 공부를 하면서 느꼇던 점이 있다. 책들은 변수 명을 모르는사람 입장에서 쓰지않아준다.
예를들어 byte를 설명할 때 코드를
byte byteValue = 5;
이런식으로 적어서 헷갈렸던적이 많다.
우리는 a,b,c,d,e로 적어서 알아보기 쉽게 사용해보자.
byte a = 10;
int b = a;
byte타입을 가진 a의 변수명에 10을 저장했다.
그리고 byte타입의 a =10 을 int 타입의 b라는 변수명에 저장한다.
이렇게 저장할 경우 자동 타입 변환이 일어나게 된다.
int타입의 크기가 더 크기 때문에 데이터의 손실도 일어나지 않게된다.
아래 결과값을 통해 확인해보자.
이것이 자동 타입 변환의 기본 개념이다.
여기서 우리의 궁금증은 멈추지 않는다.
반대로 큰 쪽에서 작은쪽으로 바꾸게 되면 자동으로 변환시켜주지 않을까?
라는 생각이 들 수 있다.
직접 한번 해보겠다.
int a = 10;
byte b = a;
int 타입 a에 10을 저장한 후 byte 타입 b에 int 타입 10을 저장한다.
그대로 코드를 넣게되면 아래와 같은 오류가 생긴다.
Type mismatch: cannot convert from int to byte 란 오류가 뜬다.
해당 오류는 타입 에러로써 불건전한 변환 방법이라 볼수 있다.
int a =0;
이라고 써도 에러는 유지가 된다.
해당 에러를 안뜨고 강제로 변환하는 방법을
강제 타입 변환 이라고 한다.
이 방법은 아래에서 알아보도록 하고, 다른 자동 타입 변환 연습을 해보자.
이번엔 int타입을 double 타입으로 변환해 보도록 하겠다.
int a = 150;
double b = a;
System.out.println(b);
int타입 a에 150의 정수를 입력 한 뒤
double 타입 b에 int타입 a = 150 을 넣은뒤 b를 출력해본다.
에러없는 결과값은 아래와 같다.
정수타입이 실수타입으로 자동타입변환이 되는 값은 .0이 붙는것을 알수 있다.
정수값 150
실수값 150.0
******주의 할 점******
자동 타입 변환엔 예외가 존재한다.
char 는 2byte의 크기를 가진다.
하지만 char는 음수가 저장될 수 없는 범위를 가지기 때문에 음수가 저장될 수 있는 byte 타입을 char 타입으로 변환 시킬 수 없다.
다음 예제를 보자.
byte 타입의 a 변수명에 3을 저장하고 char 타입의 c에 byte타입의 a = 3 값을 저장하려 할 때
아래 사진과 같이 에러가 나는 것을 알 수 있다.
Type mismatch: cannot convert from byte to char
내가 저장한 값은 음수가 아닌데 왜 에러가 나는것일까?
이유는 나도 모른다.
이클립에서 하지 말라고 한다.
우리는 이 에러를 피하고 불가피하게 강제로 형 변환을 해야할 때가 있다.
내가 음수값을 넣지 않고 말이다.
byte a = 3;
char c = a;
아래 예제에서 알아보겠다.
(char) 라는 부분이 강제로 타입 변환을 해주는 부분이다.
byte 타입으로 되어있는 부분을 강제로 변환한 뒤 저장하는 과정이다.
byte a = 3;
char c = (char)a;
System.out.println(c);
결과값을 보면 우리가 알 수 없는 문자가 나온다.
char는 문자열인데 왜 이상한 기호가 뜨는 것일까?
우리는 아스키코드를 볼 필요성이 있다.
해당 아스키 코드는 DEC 10진수 HEX 16진수 OCT 8진수 char 를 의미한다.
우리는 10진수(DEX) 3을 입력하였다. char부분을 보자
알수없는 글이 쓰여져있다.
그렇다면 우리가 알아볼 수 있는 글자를 찾아보자. 49를 적어서 넣어보겠다.
byte a = 49;
char c = (char)a;
System.out.println(c);
결과값이 1이 뜨게된다.
char는 문자인데 왜 1이 뜰까
그저 표대로 따라가기 때문이다.
이번엔 byte를 강제 타입 변환으로 char(문자) C를 출력해본다.
무슨 숫자를 넣어야할까
이를 코드로 찾아볼 수도 있다.
반대로 강제 형변환을 통해
C를 출력하기 위한 10진수는 몇일지 알아보자.
char a = 'C';
byte b = (byte)a;
System.out.println(b);
코드를 따라적어보자 아래와 같은 결과값이 나타난다.
우리는 코드를 반대로 써줌으로 인해 C의 byte 10진수의 값을 알아낼수 있엇다.
반대로 확인하는 과정 또한 필요할 것이다. 아래 예제를 보자.
byte a = 67;
char b = (char)a;
System.out.println(b);
우측을 보면 출력값이 우리가 원하는 값으로 나오는 것을 볼수 있다.
늘 확인하는 습관을 가져보자. 컴퓨터는 거짓말을 하지 않는다. 데이터 변환시 데이터 손실이 일어날 경우를 대비해서...
이런 기본적인 자동 타입 변환과 강제 타입 변환을 통해
좀더 자유로운 타입변화에 대응할 수 있을것이다.
또한 강제 타입 변환 당시 주의해야 할 점은 바꾸려는 데이터의 크기가 클 경우
데이터 손실이 발생 하므로
데이터의 크기를 잘 생각하고 하여야 한다.
특별한 일이 없으면 굳이 바꿔주지 않는것을 추천한다. 강제 변환을 하고 데이터가 손실 되었을 경우
해당 데이터의 오류를 찾을 때 나중에 눈에 잘 띄기 쉽지 않기 때문이다.
만약 데이터의 크기를 찾기 쉽지 않을 때 혹은 데이터 크기를 기억하기 귀찮을때
코드로 찾는 방법또한 말해보겠다.
System.out.println("Byte 최대값 = " + Byte.MAX_VALUE);
System.out.println("Byte 최소값 = " + Byte.MIN_VALUE);
System.out.println("short 최대값 = " + Short.MAX_VALUE);
System.out.println("short 최소값 = " + Short.MIN_VALUE);
System.out.println("int 최대값 = " + Integer.MAX_VALUE);
System.out.println("int 최소값 = " + Integer.MIN_VALUE);
System.out.println("long 최대값 = " + Long.MAX_VALUE);
System.out.println("long 최소값 = " + Long.MIN_VALUE);
System.out.println("float 최대값 = " + Float.MAX_VALUE);
System.out.println("float 최소값 = " + Float.MIN_VALUE);
System.out.println("double 최대값 = " + Double.MAX_VALUE);
System.out.println("double 최소값 = " + Double.MIN_VALUE);
해당 코드 실행 사진이다.
Byte 최대값 = 127
Byte 최소값 = -128
short 최대값 = 32767
short 최소값 = -32768
int 최대값 = 2147483647
int 최소값 = -2147483648
long 최대값 = 9223372036854775807
long 최소값 = -9223372036854775808
float 최대값 = 3.4028235E38
float 최소값 = 1.4E-45
double 최대값 = 1.7976931348623157E308
double 최소값 = 4.9E-324
타입별 최대값 최소값 모두 맞게 나온것을 확인 할 수 있다.
해당 코드를 사용하게 되면 타입별 범위가 기억이 나지 않을 때 유용하게 써먹을수 있다.
'IT Program > Java Basic' 카테고리의 다른 글
자바(java) 연산 순서 & 연산 방향 & 증감연산자(++,--) 설명 (3) | 2022.02.28 |
---|---|
자바(java) 연산자 & 연산자 종류 & 단항연산자 & 이항연산자 & 삼항연산자 (2) | 2022.02.28 |
자바(java) 띄어쓰기 하는 법 & 이스케이프 문자(\t, \n, \",\') (4) | 2022.02.27 |
java 로컬변수 지역변수 블록으로 간단하게 이해하기 & local variable error (2) | 2022.02.25 |
변수 & 변수 종류 & 예약어 & 작성 규칙(변수 명명 규칙)&println print 차이 (2) | 2022.02.25 |