본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 02-3 타입변환

by 달님🌙 2021. 7. 21.
반응형

 

타입(자료형)변환 의미

- 기본 전제 : 타입을 똑같이 맞춰주어야함

- 그러나 두 변수의 타입이 다른 경우가 있다. 타입을 맞추기 위해 형변환을 하는 방법에 대해 공부

 

타입변환 종류

1. 자동(암묵적, 묵시적)형변환 : 컴파일러가 알아서 변환해줌
2. 강제(명시적)형변환 : 사용자가 직접 괄호()를 사용하여 변환해줌

 

 

자동형변환

 

출처 [Java] 타입 변환 (tistory.com)

- (큰) 타입 변수 = (작은) 타입 변수 형태인 경우 컴파일러가 자동형변환을 함 

   예) int intValue = byteValue ; 일때 byte 타입은 1바이트짜리, int 타입은 4바이트짜리이므로  자동형변환

- 그러나 순서가 byte 수가 큰 수 일수록 자동형변환이 일어나는게 아니다.

   (실제로  long 보다 float이 바이트수는 더 작으면서 서열이 높음)

- 중요한건 byte 수가 아니라 표현범위이다.

- 모든 정수타입은 실수타입으로 자동형변환이 가능하다. (실수가 더 포괄적이므로)

 

	int iv = 9; 
//	int iv   = 999999999; //에러 -> 가능한 최대
	long lv = 9L;
//	long lv  = 999999999_999999999L;
	float fv = 9.0f;
//	float fv = 9999999999999999999_9999999999999999999.0f;

 

** 자동 타입 변환 예제

byte byteValue = 10;
int intValue/*형*/ = byteValue;/*동생*/ //동생을 int로 자동으로 형변환일어남
System.out.println("intValue: " + intValue);

char charValue = '가';
intValue/*형*/ = charValue;/*동생*/ // 자동형변환
System.out.println("가의 유니코드: " + intValue);

intValue = 50; 
long longValue = intValue;
System.out.println("longValue: " + longValue);

longValue/*8*/ = 100;
float/*4*/ floatValue = longValue;
System.out.println("floatValue: " + floatValue);

floatValue = 100.5F;
double doubleValue = floatValue;
System.out.println("doubleValue: " + doubleValue);

 

 

강제형변환

 

- 해석하는 방법에 따라 변환해줌

- 값 손실은 절대 일어나면 안된다

-작은 그릇에 큰 걸 담는 행위를 강제로 하겠다 = 강제형변환

 

** 해석

- 확장 (Promotion) : int ------> double  손실(x)  -> 자동형변환
- 축소 (Demotion)  : double -----> int  손실(o)  ->  강제형변환 ( 예> 0.5 --> 0 )

 

** 값 손실

- 큰 그릇의 물 -> 작은 그릇으로 옮길 때 큰 그릇의 물이 작은 그릇의 크기보다도 적게 들어있다면 값은 보존됨

- 반면  큰 그릇의 물이 작은 그릇의 크기보다 많이 들어있다면 물을 옮기는 과정에서 넘치게 되어 흐르는 물이 발생한다.  그게 바로 '값 손실'

- 이때 값손실이 발생하면 예상치못한 결과값을 초래한다. 강제형 변환시 이 점을 주의할 것. 

 

** 값손실 예시 1

iv = 1000000;

//byte bv = iv; // 에러 발생 (강제형변환을 해주어야함)
byte bv = (byte)iv; // 강제형변환

System.out.println(iv); //1000000;
System.out.println(bv); // 64 <--- 값손실이 발생 (예상치못한 결과)

 

** 값손실 예시 2

double dv = 3.14; 
iv = (int)dv; //강제형변환
System.out.println(iv); // 3  <--- 값손실

 

** 값손실 예시 3

int intValue = 129;
byte byteValue = (byte)intValue;
System.out.println(byteValue); //-127 <-- 129가 byte의 허용범위를 벗어났기때문에

 

** 강제 타입 변환 예제

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);

 

 

정수 연산에서의 자동 타입 변환

 

- Java는 컴파일할 때 연산의 기본 전제는 int + int 형태이다.

// 경우1 ) 변수가 아닌 정수 리터럴 일때는 에러가 안남 (int 타입으로 변환하지않음)
byte result1 = 10 + 20;
System.out.println(result1); // 30

// 경우2) byte 타입 변수들이 int 타입 변수로 젼환되어 연산
byte x = 10, y = 20;
byte result =  x  +  y; 컴파일 에러
			 (int) (int)

// 경우3) 두 피연산자 중 허용 범위가 큰타입으로 변환됨
byte x = 10, y = 20;
byte result = (byte)x + y; // 컴파일 에러
			   (byte)  (int)
		
// 경우4) 연산을 먼저 해준뒤 강제형변환   
byte x = 10, y = 20;
byte result = (byte)(x + y); // 에러X

// 경우5) 
byte x = 10, y = 20;
int result = x + y; // byte(작은) 타입을 int(큰) 타입에 넣는 자동형변환이므로 에러X

 

 

- 하지만 모든 변수가 int 타입으로 변환되는건 아니다.

- 두 피연산자 중 허용 범위가 큰 타입으로 변환된다. 

  예) result = num1 (+ / - / * / %) num2;
       [long]   [long]            [byte,char,short,int]

 

// long 타입 변환 예시
byte v1 = 10;
int v2 = 100;
long v3 = 1000L;
long result = v1 + v2 + v3;
//          [byte][int][long]
//		[int]  [long]
//		[long] [long]
//		   [long]
System.out.println(result); // 1110

 

double result1 = 10 / 4; // 2.0
double result2 = (double)10 / 4; // 2.5
double result3 = (double)10 / (double)4; // 2.5

 

실수 연산에서의 자동 타입 변환

 

- 피연산자 중 double 타입이 하나라도 존재한다면 다른 피연산자도 double 타입으로 자동 타입 변환이 된다.

 

byte byteValue1 = 10;
byte byteValue2 = 20;
//byte byteValue 3 = byteValue1 + byteValue2; //컴파일 에러
int intValue1 = byteValue1 + byteValue2;
System.out.println(intValue1); //30

char charValue1 = 'A';
char charValue2 = 1;
System.out.println(charValue1); //A
System.out.println(charValue2); // ?
//char charValue3 = charValue1 + charValue2; // 컴파일 에러
int intValue2 = charValue1 + charValue2; 
System.out.println("유니코드=" + intValue2); // 66 
System.out.println("출력문자=" + (char)intValue2); //B

int intValue3 = 10;
int intValue4 = intValue3/4;
System.out.println(intValue4); //2

int intValue5 = 10;
//int intValue6 = intValue5/4.0; // 컴파일 에러
double doubleValue = intValue5 / 4.0; // 2.5

int x = 1, y = 2;
double result = (double) x / y; // 0.5

 

float 타입 표현

 

- Java에서 실수 리터럴은 컴파일 시 double 타입으로 해석된다.

- float 타입으로 해석되려면 실수 리터럴 뒤에 f나 F를 붙여 컴파일러에게 float 변수임을 알려주어야한다.

double result1 = 1.5 + 2.3; // 3.8
//float result2 = 1.5 + 2.3; // 컴파일 에러
float result3 = 1.5f + 2.3f; //3.8

 

 

+ 연산에서의 문자열 자동 타입 변환

 

- 연산 순서는 왼쪽에서 오른쪽으로 진행된다.

- 괄호가 있다면 괄호가 우선이 된다.

//숫자 연산
int value = 10 + 2 + 8; 
System.out.println("value: "+ value); //20

//문자열 결합 연산
String str1 = 10 + 2 +"8"; 
System.out.println("str1: "+ str1); //128

String str2 = 10 + "2" +8;
System.out.println("str2: "+ str2); //1028

String str3 = "10" + 2 +8;
System.out.println("str3: "+ str3); //1028

String str4 = "10" + (2 +8);
System.out.println("str4: "+ str4); //1010

 

문자열을 기본 타입으로 강제 타입 변환

 

출처: [컴퓨터 프로그래밍] #4 자료형 변환 (tistory.com)

 

//문자열 -------> 숫자   //이건 위에 표 참고
//문자열 <------- 숫자 //이것도 가능해야함

String str = "100";
int    var = 100;

str = str + 1;
System.out.println(str); // 1001

var = var + 1;
System.out.println(var); // 101

var = Integer.parseInt(str); 
System.out.println(var); // 1001
System.out.println(str + 1); // 10011

//숫자 <------문자열
int value = Integer.parseInt("123456") + 1; 
System.out.println(value); // 123457

//문자열 <-------- 숫자
String number = "123456";
System.out.println(number + 1); // 1234561

//문자열 <-------- 숫자
String str_1 = Integer.toString(value) + "8"; 
System.out.println(str_1); // 1234578
str_1 = String.valueOf("100" + 1); 
System.out.println(str_1); //1001

 

** 기본타입과 문자열 간의 변환 예제

int value1 = Integer.parseInt("10");
double value2 = Double.parseDouble("3.14");
boolean value3 = Boolean.parseBoolean("true");

System.out.println("value1: " + value1); //value1: 10
System.out.println("value2: " + value2); //value2: 3.14
System.out.println("value3: " + value3); //value3: true

String str1 = String.valueOf(10);
String str2 = String.valueOf(3.14);
String str3 = String.valueOf(true);

System.out.println("str1: " + str1); //str1: 10
System.out.println("str2: " + str2); //str2: 3.14
System.out.println("str3: " + str3); //str3: true

 

 

반응형

댓글