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 타입으로 변환