Programming Language/JAVA (2) - 혼공자
[Java 혼자 공부하는 자바] 타입 변환, 자동 및 강제 타입 변환, 문자열 결합 합산
나수비니
2023. 9. 20. 20:30
728x90
핵심 키워드
- 자동 타입변환, 강제 타입변환, 문자열 결합 연산
핵심 포인트
- 타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
타입변환
- 변수 값을 다른 타임의 변수에 저장할 때 타입 변환이 발생할 수 있다.
byte a = 10; //byte 타입: 변수 a에 10을 저장
int b = a; //byte 타입 변수 a에 저장된 10을 int 타입 변수 b에 복사해서 저장
자동 타입 변환
- 값의 허용 범위가 작은 타입이 큰 타입으로 전환될 경우
기본 타입의 허용 범위 순
- byte < short < int < long < float < double
자동 타입 변환에서의 예외
byte byteValue = 65;
char charValue = byteValue; // 컴파일에러
📍 문제점
- char > byte 타입이나, 컴파일에러 발생한다. 왜? ⇒ char 타입의 허용 범위는 음수를 포함하지 않기 때문.
- byte = ( -128~127), Char (0~65000/유니코드)
타입 변환
- char 타입의 경우 int 타입으로 자동변환되면 유니코드 값이 int 타입에 저장
강제 타입 변환 (casting)
- 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나누어 한 조각만 저장
- 작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
캐스팅 연산자 괄호 () 사용: 괄호 안이 나누는 단위
- int → byte 변환
- int 타입 Value → byte 타입으로 쪼개어서 변환
int intValue = 10;
byte byteValue = (byte) intValue; //강제타입변환
- int → char 변환
int intValue = 65;
char charValue = (char) intValue;
System.out.println(charValue;) // "A"가 출력
package sec03.exam01;
public class CastingExample {
public static void main(String[] args) {
int intValue = 44032;
char charValue = (char) intValue;
System.out.println(charValue);
long longValue = 500;
// intValue = (int) longvalue;
System.out.println(intValue);
double doubleValue = 3.14;
intValue = (int) doubleValue;
System.out.println(intValue);
}
}
가
44032
3
정수 연산에서의 자동 타입 변환
- 정수 타입 변수가 산술 연산식에서 피연산자로 사용되는 경우
- byte, char, short 타입 변수는 int 타입으로 자동 변환
- 특별한 경우 아니면, 정수 연산에는 int 타입으로 선언하는 것이 효과적
- 피 연산자 중 하나가 long 타입이면 다른 피연산자는 long 타입으로 자동 변환
- 피 연산자 중 하나가 long 타입일 경우 다른 피연산자도 long 타입으로 변환
package sec03.exam03;
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);
}
}
실수 연산에서의 자동 타입 변환
- 피연산자 중 하나가 double 타입일 경우 다른 피 연산자도 double 타입으로 변환
- intValue → double 값으로 변환
int intValue = 10;
double doubleValue = 5.5;
double result = **intValue + doubleValue**; //result에 15.5가 저장됨.
- 다른 타입 연산이 필요한 경우 먼저 강제 변환한 뒤 연산 수행
int intValue = 10;
double doubleValue = 5.5;
double result = **intValue + doubleValue**; //result에 15.5가 저장됨.
- 실수 리터럴 연산
- double result = 1.5; + 2.3;
- float result = 1.5 + 2.3
- float result = 1.5f + 2.3f;
정수 연산 결과를 실수로 저장할 때 주의할 점
- 정수 연산의 결과는 정수
int x = 1;
int y - 2;
double result = x/y;
System.out.println(result);
0.0
- 1을 x에 저장, 2를 y에 저장. 1 / 2 = 0.5
- double타입 변수에 0.5가 저장이 안 됨. 정수의 산술 연산 결과는 정수가 나온다. 정수 / 정수 ⇒ 0.0이 나온다.
실수 결과를 얻으려면 실수 연산으로의 변환 필요
int x = 1;
int y = 2;
double result **(double) x / y;**
System.out.println(result);
int x = 1;
int y = 2;
double result = x / **(double) y;**
System.out.println(result);
int x = 1;
int y = 2;
double result = (**double) x / (double) y;**
System.out.println(result);
package sec03.exam05;
public class OperationPromotionExample {
public static void main(String[] args) {
byte byteValue1 = 10;
byte byteValue2 = 20;
// byte byteVaule3 = byteValue1 + byteValue2; > 정수 연산의 결과는 정수가 나오는데, byteValue1과2는 int 타입으로변환된다
int intValue1 = byteValue1 + byteValue2;
System.out.println(intValue1);
char charValue1 = 'A';
char charValue2 = 1;
int intValue2 = charValue1 + charValue2;
System.out.println("유니코드= " + intValue2);
System.out.println("출력문자=" + (char)intValue2);
int intValue3 = 10;
int intValue4 = intValue3 / 4;
System.out.println(intValue4);
double doubleValue = intValue3 / 4.0;
System.out.println(doubleValue);
int x = 1;
int y = 2;
double result1 = (double) x / y;
double result2 = x / (double) y;
double result3 = (double) x / (double) y;
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
연산에서의 문자열 자동 타입 변환
연산
- 피연산자가 모두 숫자일 경우 덧셈 연산
- 피연산자 중 하나가 문자열일 경우, 나머지 피연산자도 문자열로 자동 변환되고 문자열 결합 연산
int value = 3+7; -> int value = 10;
int value = "3" + 7 -> String str = "37";
String str = 3 + "7" -> String str = "37";
package sec03.exam06;
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);
}
}
value:20
str1:128
str2:1028
- 연산은 앞에서부터 순차적으로 수행
- 먼저 수행된 연산이 결합 연산인 경우, 모든 연산이 결합 연산이 됨
문자열을 기본 타입으로 강제 타입 변환
- 문자열이 숫자 외 요소를 포함할 경우 숫자 타입 변환 시도할 경우 숫자 형식 예외 발생
String str5 = "1a";
int value = Integer.parseInt(str5);
//오류 발생 원인: 문자열이 숫자 외 요소를 포함할 경우에 숫자 타입으로 변환 시도할 경우 숫자형식 예외 발생
- String.valueOf() 메소드 사용하여 기본 타입을 문자열로 변환
package sec03.exam07;
public class PrimitiveAndStringConversionExample {
public static void main(String[] args) {
String str1 = "10";
int value1 = Integer.parseInt(str1);
System.out.println("value1: " + value1);
int value2 = Integer.parseInt("10");
double value3 = Double.parseDouble("3.14");
boolean value4 = Boolean.parseBoolean("true");
System.out.println("value2: " + value2);
System.out.println("value3: " + value3);
System.out.println("value4: " + value4);
// int value5 = 10;
String str2 = String.valueOf(10);
String str3 = String.valueOf(3.14);
//value 5에 10을 저장했기에 10이 저장되어있다. 이를 문자열로 바꾸고 싶다면?
//str2에 문자열을저장하고 싶기에, str을 저장하고 싶기에 valueoOf에 저장된 숫자 10이
//문자열로 저장된다. 이를 str2에 저장한다.
System.out.println("str2: " + str2);
System.out.println("str3: " + str3);
}
}
끝내기 핵심 - 타입 변환
- 자동타입변환
- 자동으로 일어남. 값의 단위가 작은 허용 범위 → 큰 타입으로 저장
- 강제타입변환
- 강제로 타입을 변환하는 것. 값의 허용 범위가 큰 타입 → 작은 타입으로 쪼개어서 저장
- 문자열 결합 연산
- 문자열 + 연산을 하면 다른 피연산자도 문자열로 변환되어, 문자열 결합이 발생함
- Interger.parselnt()
- 문자열을 정수 int 타입으로 변환
- Double.parseDouble()
- 문자열을 실수 double 타입으로 변환