자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생한다.
byte < short < char < int < long < float < double
정수 타입이 실수 타입으로 저장될 경우에는 무조건 자동 타입 변환이 일어난다.
char 타입보다 허용 범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없다.
char 타입의 허용 범위는 음수를 포함하지 않는데 byte 타입은 음수를 포함하기 때문이다.
package chapter2_3;
public class PromotionExample {
public static void main(String[] args) {
//자동 타입 변환
byte byteValue = 10;
int intValue = byteValue; // byte에서 int로
System.out.println("intValue : " + intValue);
char charValue = '가';
intValue = charValue; // char 에서 int로
System.out.println("가의 유니코드 : " + intValue);
intValue = 50;
long longValue = intValue; // int 에서 long로
System.out.println("LongValue: " + longValue);
longValue = 100;
float floatValue = longValue; // long 에서 float로
System.out.println("floatValue: " + floatValue);
floatValue = 100.5f;
double doubleValue = floatValue; // float 에서 double로
System.out.println("doubleValue: " + doubleValue);
}
}
/*
실행결과
intValue: 10;
가의 유니코드: 44032
longValue: 50
flatValue: 100.0
doubleValue: 100.5
*/
강제 타입 변환
큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없다.
하지만 강제로 타입을 변환 시켜서 작은 허용 범위 타입으로 나누어 저장할 수 있다.
왜 강제로 타입을 변환하는가?
int에서 char로 타입 변환을 하면 문자를 출력할 수 있다.
double/float에서 int로 변환하면 소수점 이하 부분은 버리고 정수 부분만 저장할 수 있다.
package chapter2_3;
public class CastingExample {
//강제 타입 변환
public static void main(String[] args) {
int intValue = 44032;
char charValue = (char) intValue; int에서 char로
System.out.println(charValue);
long longValue = 500;
intValue = (int) longValue; // long에서 int로
System.out.println(intValue);
double doubleValue = 3.14;
intValue = (int) doubleValue; // double에서 int로
System.out.println(intValue);
}
}
/*
실행결과
가
500
3
*/
정수 연산에서의 자동 타입 변환
package chapter2_3;
public class ByteOpreationExample {
// 정수 타입의 연산
public static void main(String[] args) {
byte result1 = 10 + 20;
System.out.println(result1);
byte x = 10;
byte y = 20;
int result2 = x + y; // 저장되는 타입이 int이기 때문에 x,y는 byte에서 int로 변환된다.
System.out.println(result2);
}
}
/*
실행 결과
30
30
*/
package chapter2_3;
public class LongOperationExample {
public static void main(String[] args) {
byte value1 = 10;
int value2 = 100;
long value3 = 1000L;
long result = value1 + value2 + value3;
System.out.println(result);
}
}
/*
실행결과
1110
*/
실수 연산에서의 자동 타입 변환
소문자 f 또는 대문자 F가 없는 실수 리터럴을 double타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다.
1에서 2를 나누면 0.5가 된다.
하지만 아래의 코드는 그렇지 않을수도 있다는 결과를 보여준다.
package chapter2_3;
public class divide1 {
public static void main(String[] args) {
int x = 1;
int y = 2;
// double result = x / y;
// System.out.println(result);
// 위의 코드에서는 0.5가 아닌 0.0이 나온다.
double result = (double) x / (double) y;
System.out.println(result);
// 0.5가 나온다.
}
}
package chapter2_3;
public class OperationsPromotionExample {
// 연산식에서 자동 타입 변환
public static void main(String[] args) {
byte byteValue1 = 10;
byte byteValue2 = 20;
// byte byteValue3 = byteValue1 + byteValue2; 컴파일 에러가 뜬다.
int intValue1 = byteValue1 + byteValue2;
System.out.println(intValue1);
char charValue1 = 'A';
char charValue2 = 1;
// char charValue3 = charValue1 + charValue2; 컴파일 에러가 뜬다.
int intValue2 = charValue1 + charValue2;
System.out.println("유니코드=" + intValue2);
System.out.println("출력문자=" + (char) intValue2);
int intValue3 = 10;
int intValue4 = intValue3/4;
System.out.println(intValue4);
int intValue5 = 10;
// int intValue6 = 10 / 4.0; 컴파일 에러가 뜬다.
double doubleValue = intValue5 / 4.0;
System.out.println(doubleValue);
int x = 1;
int y = 2;
double result = (double) x / y;
System.out.println(result);
}
}
/* 실행결과
30
유니코드=66
출력문자=B
2
2.5
0.5
*/
+ 연산에서의 문자열 자동 타입 변환
자바에서 + 연산잦는두 가지 기능을 가지고 있다.
피연산자가 모두 숫자일 경우에는 덧셈 연산을
피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 수행한다.
package chapter2_3;
public class StringConcatExample {
public static void main(String[] args) {
//숫자연산
int value = 10 + 2 + 8;
System.out.println("value: " + value);
//문자열 결합 연산
String str1 = 10 + 2 + "8";
System.out.println("str1: " + str1);
String str2 = 10 + "2" + 8;
System.out.println("str2: " + str2);
String str3 = "10" + 2 + 8;
System.out.println("str3: " + str3);
String str4 = "10" + (2+8);
System.out.println("str4: " + str4);
}
}
/* 실행결과
value: 20
str1: 128
str2: 1028
str3: 1028
str4: 1010
*/
문자열을 기본 타입으로 강제 타입 변환
package chapter2_3;
public class PrmitiveAndStringConverstionExample {
public static void main(String[] args) {
int value1 = Integer.parseInt("10"); // 문자열 10을 int로
double value2 = Double.parseDouble("3.14"); // 3.14문자열을 double로
boolean value3 = Boolean.parseBoolean("true"); // boolean value3 = true라고 적으면 된다.
System.out.println("value1: " + value1);
System.out.println("value2: " + value2);
System.out.println("value3: " + value3);
String str1 = String.valueOf(10);
String str2 = String.valueOf(3.14);
String str3 = String.valueOf(true);
System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
System.out.println("str3: " + str3);
}
}
/* 실행결과
value1: 10
value2: 3.14
value3: true
str1: 10
str2: 3.14
str3: true
*/
확인문제
1. 자동 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?
byte byteValue = 10;
char charValue = 'A';
1. int intValue = byteValue;
2.int intValue = charValue;
3.short shortValue = charValue;
4.double doubleValue = byteValue;
char 타입의 양의 허용범위가 short 타입보다 더 크다.
2. 강제 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?
int intValue = 10;
char charValue = 'A';
double doubleValue = 5.7;
String strValue = "A";
1. double var = (double) intValue;
2. byte var = (byte) intValue;
3. int var = (int) doubleValue;
4. char var = (char) strValue;
문자열을 char타입으로 변환할 수 없다.
3. 연산식에서의 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇인가?
byte byteValue = 10;
float floatValue = 2.5F;
double doubleValue = 2.5;
1. byte result = byteValue + byteValue;
2. int result = 5 + byteValue;
3. float result = 5 + floatValue;
4. double result = 5 + doubleValue;
1번의 연산 결과는 int 타입이다.
4. 다음 코드에서 컴파일 에러가 발생하는 위치와 이유를 설명하시오.
short s1 = 1;
short s2 = 2;
int i1 = 3;
int i2 = 4;
short result = s1 + s2; // 저장된 수가 int 타입으로 변환된다.
int result = i1 + i2;
s1 + s2 의 연산 결과는 int이다.
5. 알파벳 a의 유니코드는 97이고 b의 유니코드는 98이다. 따라서 a의 유니코드에 1을 더하면 b의 유니코드가 된다.
다음 코드에서 컴파일 에러가 발생할 때 어떻게 수정해야 하는가?
char c1 = 'a';
char c2 = c1 + 1;
System.out.println(c2);
문자열 + 정수 타입이기 때문에 컴파일 에러가 발생한다. 연산의 결과를 char 타입으로 강제 타입 변환해야 한다.
char c2 = (char)(c1 + 1);
6. 다음 코드의 실행 결과는?
int x = 5;
int y = 2;
int result = x / y;
System.out.println(result);
2
7. 위의 코드에서 2.5가 나오게 하려면 어떻게 수정하는가?
int x = 5;
int y = 2;
double result = (double)x / (double)y; // int를 double로 변경하고 인수를 double로 강제 타입 변환한다.
System.out.println(result);
8. 두 실수를 덧셈 연산하고 소수점 이하 자리르 버리고 싶을 떄 코드를 작성하시오
double var1 = 3.5;
double var2 = 2.7;
int result = (int)(var1 + var2);
9. result 변수에 9 가 저장되도록 코드를 작성하시오
public class test {
public static void main(String[] args) {
long var1 = 2L;
float var2 = 1.8f;
double var3 = 2.5;
String var4 = "3.9";
int result = (int) var1 + (int)(var2 + var3 )+ (int)Double.parseDouble(var4);
System.out.println(result);
}
}
10. 다음 코드를 출력했을 때 실행 결과는?
public class test {
public static void main(String[] args) {
String str1 = 2 + 3 + "";
String str2 = 2 + "" + 3;
String str3 = "" + 2 + 3;
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
5
23
23
11. 문자열을 기본 타입으로 변환하려 할 때 알맞은 코드를 작성하시오
byte value = 1번 ("10");
int value = 2번 ("1000");
float value = 3번 ("20.5");
double value = 4번 ("3.14159");
답
public class test {
public static void main(String[] args) {
byte value = Byte.parseByte("10");
int value1 = Integer.parseInt("1000");
float value2 = Float.parseFloat("20.5");
double value3 = Double.parseDouble("3.14159");
}
}
'Java > 혼공자' 카테고리의 다른 글
JAVA) 변수와 시스템 입출력 (0) | 2023.04.02 |
---|---|
JAVA) 기본 타입 (0) | 2023.04.01 |
JAVA) 변수 (0) | 2023.04.01 |