한 변수값을 다른 변수에 복사해서 저장할 때, 두 변수의 타입이 다르다면?
저장이 가능할 수도, 안될수도.
<타입 변환>
byte a =10;
int b =a;
복사해서 저장할 때 int타입의 값으로 변환되었다.
ㅇ자동 타입 변환 (=promotion)
ㄴ큰 = 작은
ㄴbyte < short < int < long < float < double,
따라서 정수 타입을 실수 타입으로 저장할 때에는 무조건 자동 타입 변환
ㄴ예외: byte 타입을 char타입으로 자동 변환은 불가. byte는 음수 가능하지만 char은 음수 불가능.
ㅇ강제 타입 변환 (=casting)
ㄴ작은 = 큰
ㄴ예) int intValue = 10; byte byteValue = (byte) intValue;
(byte)캐스팅 연산자를 사용하여 강제 변환하였다.
<정수 연산에서의 자동 타입 변환>
연산시 int타입보다 작은 byte, short타입이 피연산자로 사용되면 int타입으로 변환되어 연산된다.
따라서 연산 결과를 byte가 아닌 int에 저장해야 한다.
예를 들어서..
byte x = 10;
byte y = 20;
byte result = x + y; //컴파일에러
int result = x + y;
그래서 연산 할거면 타입 설정을 int로 하는게 나을 수 있다. 타입 변환이 줄면 실행 성능 향상된다.
(주의 : 피연산자가 변수가 아니면 상관 없다. 예를 들어서 byte result = 10 + 20;은 문제 없다. 피연산자가 변수가 아니므로 int타입으로 변환하지 않음. <<자바 컴파일러는 컴파일 단계에서 10+20을 미리 연산해 30을 만들고, result 변수에 30을 저장하도록 바이트 코드를 생성한다 우와 신기신기)
정수 연산식에서 모든 변수가 int로 변환되는건 아니다. 피연산자중에 범위가 가장 큰 타입으로 변환된다.
그래서 피연산자 중 범위가 큰 애의 타입으로 연산 결과를 저장해야한다.
<실수 연산에서의 타입 변환> 이것도 마찬가지다.
자동 타입 변환은 큰 범위인걸로 되는데, 만약 실수랑 정수 연산에서 정수결과를 얻고 싶다면 이런 식으로 캐스팅한다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue;
실수연산할 때 주의.. 자바는 기본적으로 실수 리터럴을 double로 해석하므로 float을 나타내고 싶으면 꼭 f를 붙여 연산하자. 예를 들면 float result = 1.5f + 2.3f;
<나눗셈 할 때>
int x =1; int y =2;
double result = x / y;
System.out.println(result);
위 코드는 0.0이 출력된다. int계산을 먼저 한 값 0을 double타입인 result에 넣기 때문에.. 0.0이 나온다.
0.5가 나오게 하려면 x/y의 연산에서 x또는 y를 (double)하고 연산하면 된다.
이 때 (double)(x/y)는 뻘짓이다
<문자열을 기본 타입으로 강제 변환>
오 이거 예전에 많이 해본거다!
문자열 속 숫자를 정수or실수타입 변수에 넣기
String str = "10";
byte value = Byte.parseByte(str);
String str = "200";
short value = Short.praseShort(str);
String str = "300000";
int value = Integer.parseInt(str);
String str = "40000000000";
long value = Long.parseLong(str);
String str = "12.345";
float value = Float.parseFloat(str);
String str = "12.345";
double value = Double.parseDouble(str);
String str = "true";
boolean value = Boolean.parseBoolean(str);
아 이게 논리값도 되는구나
아무튼
문자열 변환 가능한 거 말고 알파벳이나 특문, 한글 등 포함된 것을 숫자 타입으로 변환하려고 하면
숫자 형식 예외가 발생한다. (NumberFormatException)
위와 반대로 기본타입을 문자열로 변경하려면, 간단히
String.valueOf() 메소드를 이용한다.
확인 문제..
1번: short shortValue = charValue;는 컴파일 에러가 날 수 있다.
short의 범위 -2^15 ~ 2^15 -1 이고 char의 범위 0 ~ 2^16 -1이므로
short의 범위를 벗어나는 값이 존재한다.
2번: 문자열을 char타입으로 캐스팅할 수 없다. parse에 없다. 강제 타입 변환 못한다.
5번: 컴파일 에러
char c1 = 'a';
char c2 = c1 +1;
System.out.println(c2);
->> 두번째 줄에서 연산 값은 int인데 char타입 변수에 저장하고 있음.. 캐스팅 해줘야 함.
char c2 = (char) (c1 + 1); 이렇게
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 6/30 02-4~03-2 (0) | 2020.06.30 |
---|---|
[혼자 공부하는 자바] 6/28 02-4 변수와 시스템 입출력 (0) | 2020.06.28 |
[혼자 공부하는 자바] 6/28 01-1 ~ 02-2 (0) | 2020.06.28 |
[혼자 공부하는 자바][신용권] 목차 (0) | 2020.06.28 |
[JAVA] 클래스의 구성요소 / 필드(field) (0) | 2020.04.22 |